home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Leser 19
/
Amiga Plus Leser CD 19.iso
/
Sound
/
AmySequencer
/
AmySequencer2.text
< prev
next >
Wrap
Text File
|
2002-11-13
|
279KB
|
7,021 lines
Versione$="$VER: AmySequencer 0.16 (13.11.2002)"
;-----------------------
;versione del programma
;program version
;----------------
;-> AmySequencer2 by Stefano Maria Regattin
;d> 19 gennaio 2002 da AmySequencer
;m> 20,21,22,23,24,26,30,31 gennaio 2002
;m> 1,2,3,4,5,6,7,9,10,11,13,15,16,17,18,19,20,22,23,24,27,28 febbraio 2002
;m> 1,2,3,4,5,6,7,8,10,11,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,31 marzo 2002
;m> 1,2,4,5,6,8,9,10,11,13,14,19,20,21,22,24,25,28,29,30 aprile 2002
;m> 4,5,6,8,9,10,11,12,13,14,15,17,18 maggio 2002
;m> 12,14,15,16,17,20,22,23,28,30 giugno 2002
;m> 1,3,4,5,9,10,13,15,16 luglio 2002
;m> 10,13,14,23 agosto 2002
;m> 2,5,22 settembre 2002
;m> 8,9,12,16,17,18,20,21,22,23,24,25,26,28 ottobre 2002
;m> 4,5,6,7,9,12,13 novembre 2002
;---------------------------------
;------------------------------------------
;dati per i colori originali dello schermo
;original screen colours data
;-----------------------------
Data.b 0,0,0
Data.b 4,4,4
Data.b 8,8,8
Data.b 12,12,12
Data.b 12,0,0
Data.b 12,6,0
Data.b 12,12,0
Data.b 6,12,0
Data.b 0,12,0
Data.b 0,12,6
Data.b 0,12,12
Data.b 0,6,12
Data.b 0,0,12
Data.b 6,0,12
Data.b 12,0,12
Data.b 12,0,6
;------------------------------------------------------------------------
;il seguente comando indica dove si trovano sul vostro computer i codici
; sorgenti di Blitz2 da includere in questo programma
;the following command states the place on your computer where are the Blitz2
; source codes to be included into this program
;-----------------------------------------------
INCDIR "Lavoro:Linguaggi/Blitz/"
;-------------------------------------------------------------------------
;questo comando inserisce una sola volta in questo punto del programma il
; codice sorgente specificato
;this command inserts one unique time in this point of the program the
; specified source code
;-----------------------
XINCLUDE "MIDIConstants.bb2"
;------------------------------------------------------------------------------
;le seguenti costanti servono per ricavare il periodo di un canale audio AMIGA
; dalla frequenza di campionamento; ce ne e' una per gli AMIGA PAL e una per
; quelli NTSC
;the following constants are used to obtain an AMIGA audio channel period from the
; sampling frequency; there is one for PAL AMIGAs and one for NTSC AMIGAs
;-------------------------------------------------------------------------
;PAL timing
#TemporizzazionePAL=3546895
;NTSC timing
#TemporizzazioneNTSC=3579545
;-------------------------------------------------------------------------
;questa costante indica il numero di riferimento della fonte di caratteri
; Topaz8
;this constant states the characters font Topaz8 referring number
;-----------------------------------------------------------------
#FonteDiCaratteriTopaz8=0
;-------------------------------------------------------------------------
;questa variabile imposta il periodo minimo per i canali audio; il limite
; per i vecchi AMIGA e' 123, ma io ho scelto un periodo minimo di 125, che
; corrisponde ad un La nella nona ottava
;this variable sets the audio channels minimum period; on the oldest AMIGA the
; lowerst usable period is 123, but I have choosen minimum period of 125, that is
; the A note in the ninth octave
;--------------------------------
#PeriodoMinimo=125
;---------------------------------------------------------------------------
;questa costante indica il numero di riferimento della tavolozza dei colori
; disponibili
;this constant states the colour palette referring number
;---------------------------------------------------------
#TavolozzaDeiColori=0
;--------------------------------------------------
;le seguenti costanti indicano il tipo di finestra
;the following constants state the window's kind
;------------------------------------------------
;window sizing gadget
#GadgetRidimensionaFinestra=1
;draggable window
#FinestraMovibile=2
;window depth gadget
#GadgetNascondiFinestra=4
;close gadget
#GadgetChiudiFinestra=8
;sizing window right border (you must set gimme-zero-zero to use it)
#BordoDestraFinestraRidimensionabile=16
;sizing window bottom border (you must set gimme-zero-zero to use it)
#BordoBassoFinestraRidimensionabile=32
;backdrop window
#FinestraDiSfondo=256
;gimme-zero-zero window
#FinestraConMemoriaSfondo=1024
;borderless window
#FinestraSenzaBordi=2048
;window active
#FinestraAttivata=4096
;------------------------------------------------
;le seguenti costanti indicano il tipo di gadget
;the following constants state the gadgets' kind
;------------------------------------------------
;invert
#InvertiGadget=1
;related to window's right side
#PosizioneRelativaAllaDestraDellaFinestra=2
;related to window'w bottom side
#PosizioneRelativaAlBassoDellaFinestra=4
;size as window's inner width
#ComeLarghezzaInternaFinestra=8
;size as window's inner height
#ComeAltezzaInternaFinestra=16
;box select
#ScatolaDaSelezionare=32
;horiziontal movement
#MovimentoOrizzontale=64
;vertical movement
#MovimentoVerticale=128
;no border
#NessunBordo=256
;exclude each other
#SiEscludonoLUnLAltro=512
;attach to window's right side
#AttaccaADestraDellaFinestra=1024
;attach to window's left side
#AttaccaASinistraDellaFinestra=2048
;attach to window's top
#AttaccaAllaFinestraInAlto=4096
;attach to window's bottom
#AttaccaAllaFinestraInBasso=8192
;gimme-zero-zero border gadget
#GadgetConMemoriaBordo=16384
;--------------------------------------------------------
;le seguenti costanti indicano gli eventi delle finestre
;the following constants state window events
;--------------------------------------------
;you have pressed a mouse button
#HaiPremutoUnTastoDelTopo=8
;you have moved the mouse
#HaiMossoIlTopo=16
;you have pressed a gadget
#HaiPremutoUnGadget=32
;you have released a gadget
#HaiRilasciatoUnGadget=64
;you have activated a menu
#HaiAttivatoIlMenu=256
;you have closed the window
#HaiChiusoLaFinestra=512
;you have pressed a key
#HaiPremutoUnTasto=1024
;--------------------------------------------------------
;le seguenti costanti indicano i tasti cliccati del topo
;the following constants state the clicked mouse buttons
;--------------------------------------------------------
;left mouse button pressed
#TastoSinistroPremutoDelTopo=1
;right mouse button pressed
#TastoDestroPremutoDelTopo=2
;left mouse button released
#TastoSinistroDelTopoRilasciato=5
;right mouse button released
#TastoDestroDelTopoRilasciato=6
;-----------------------------------------------------------------------------
;le seguenti costanti indicano il valore ascii del tasti Backspace, Esc e dei
; tasti freccia
;the following constants state the ascii value for the Backspace, Esc and
; arrow keys
;------------
#Backspace=8
#Escape=27
#CursorUp=28
#CursorDown=29
#CursorRight=30
#CursorLeft=31
;Backspace key
TastoBackspace$=Chr$(#Backspace)
;Esc key
TastoEsc$=Chr$(#Escape)
;Cursor up key
TastoCursoreSu$=Chr$(#CursorUp)
;Cursor down key
TastoCursoreGiu$=Chr$(#CursorDown)
;Cursor right key
TastoCursoreDestra$=Chr$(#CursorRight)
;Cursor left key
TastoCursoreSinistra$=Chr$(#CursorLeft)
;-----------------------------------------------------------
;le seguenti costanti indicano i bottoni del joypad premuti
;the following constants state the joypad pressed buttons
;---------------------------------------------------------
#_PlayB=1
#_ReverseB=2
#_ForwardB=4
#_GreenB=8
#_YellowB=16
#_RedB=32
#_BlueB=64
;-------------------------------------------------------------------------
;le seguenti costanti indicano la direzione scelta con il joystick/joypad
;the following constants state the choosen direction by joystick/joypad
;-----------------------------------------------------------------------
#JoyMovedUp=0
#JoyMovedRight=2
#JoyMovedDown=4
#JoyMovedLeft=6
#JoyNotMoved=8
;screen
#Schermo=0
;main window
#FinestraPrincipale=0
;main window's gadget list
#ListaGadgetPrincipale=0
;main window's menu list
#ListaMenuPrincipale=0
;sounds editor window
#FinestraEditoreSuoni=1
;sounds editor window's gadget list
#ListaGadgetEditoreSuoni=1
;sound editor window's menu list
#ListaMenuEditoreSuoni=1
;notes editor window
#FinestraEditoreSequenza=2
;notes editor window's gadget list
#ListaGadgetEditoreSequenza=2
;notes editor window's menu list
#ListaMenuEditoreSequenza=2
;note editor window's zonetable
#TabellaZoneEditoreSequenza=0
;window to change basic note length
#FinestraCambioEventoBase=3
;basic note length change window's gadget list
#ListaGadgetCambioEventoBase=3
;slider editore suoni, valore utile qualsiasi maggiore di zero
;sounds editor's slider, useful value any greater than zero
#SliderEditoreSuoni=1
;basic note change window's zonetable
#TabellaZoneCambioEventoBase=1
;background pic's bitmap
#BitmapImmagineDiSfondo=0
;-------------------------------------------------------------------------
;queste costanti indicano i cambiamenti che possono essere applicati agli
; eventi musicali
;these constants states different changes that can be applied to musical
: events
;--------
;select a musical event
#SelezionaUnEventoMusicale=0
;change the channel of the selected musical events
#CambiaIlCanaleDegliEventiMusicaliSelezionati=1
;increase by one the selected musical events
#AlzaDiUnoGliEventiMusicaliSelezionati=2
;decrease by one the selected musical events
#AbbassaDiUnoGliEventiMusicaliSelezionati=3
;move forward the selected musical events
#SpostaAvantiNelTempoGliEventiMusicaliSelezionati=4
;move backward the selected musical events
#SpostaIndietroNelTempoGliEventiMusicaliSelezionati=5
;delete the selected musical events
#EliminaGliEventiMusicaliSelezionati=6
;select all the musical events
#SelezionaTuttiGliEventiMusicali=7
;deselect all the musical events
#DeselezionaTuttiGliEventiMusicali=8
;toggle selection of all musical events
#InvertiLaSelezioneDiTuttiGliEventiMusicali=9
;cut all the selected musical events
#TagliaGliEventiMusicaliSelezionati=10
;copy all the selected musical events
#CopiaGliEventiMusicaliSelezionati=11
;paste the previous cutted or copied musical events
#IncollaGliEventiMusicali=12
;forget the previous cutted or copied musical events
#DimenticaGliEventiMusicaliTagliatiOCopiati=13
;select same kind's musical events with the same channel
#SelezionaGliEventiMusicaliUguali=14
;add 10 to the to the event value of the selected musical events that aren't notes
#AggiungiDieciAgliEventiMusicaliSelezionati=15
;sub 10 to the event value of the selected musical events that aren't notes
#SottraiDieciAgliEventiMusicaliSelezionati=16
;put up of one octave the selected notes
#AlzaDiUnOttavaLeNoteSelezionate=17
;put down of one octave the selected notes
#AbbassaDiUnOttavaLeNoteSelezionate=18
;change the value of the selected musical events, that is velocity for notes
#CambiaIlValoreDegliEventiMusicaliSelezionati=19
;increase the selected notes length
#AllungaLaDurataDelleNoteSelezionate=20
;decrease the selected notes length
#RiduciLaDurataDelleNoteSelezionate=21
;add a beat to selected time signature events
#AggiungiUnBattitoAlTempoSelezionato=22
;sub a beat to selected time signature events
#TogliUnBattitoAlTempoSelezionato=23
;add a measure to selected time signature events
#AggiungiUnaMisuraAlTempoSelezionato=24
;sub a measure to selected time signature events
#TogliUnaMisuraAlTempoSelezionato=25
;go to the insertion point
#VaiAlPuntoDInserimento=26
;------------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle sequenze visualizzate
;the following constants state the displayed sequences drawing mode
;-------------------------------------------------------------------
;unselected sequence
#SequenzaNonSelezionata=0
;selected sequence
#SequenzaSelezionata=1
;highlighted sequence
#SequenzaEvidenziata=2
;----------------------------------------------------------------------------
;le seguenti costanti indicano lo stato che un evento musicale puo' assumere
;the following constants state the status that a musical event can be
;---------------------------------------------------------------------
;unselected event
#EventoMusicaleNonSelezionato=0
;selected event
#EventoMusicaleSelezionato=1
;cutted event
#EventoMusicaleTagliato=2
;copied event
#EventoMusicaleCopiato=4
;played event
#EventoMusicaleEseguito=8
;ended event
#EventoMusicaleTerminato=16
;----------------------------------------------
;queste costanti indicano come suonare le note
;these constants state how to play notes
;----------------------------------------
;execute events from the main window
#EseguiGliEventiMusicaliDallaFinestraPrincipale=0
;execute events from the sequence editor
#EseguiGliEventiMusicaliDallEditoreSequenza=1
;---------------------------------------------------------------------------
;le seguenti costanti sono usate dal comando WJam per la selezione del modo
; grafico
;the following constants are used by WJam command for the graphic mode
; selection
;-----------
;one colour with transparent background
#UnColoreConSfondoTrasparente=0
;two colours with full background
#DueColoriConSfondoPieno=1
;second time same colour
#SecondaVoltaStessoColore=2
;--------------------------------------------------------------
;le seguenti costanti indicano il tempo base che e' 4/4, cioe'
; #BattitiDiBase/#MisureDiBase
;the following constants states the basic time that is 4/4, that is
; #BattitiDiBase/#MisureDiBase
;------------------------------
;------------
;basic beats
;------------
#BattitiDiBase=4
;---------------
;basic measures
;---------------
#MisureDiBase=4
;-----------------------------
;basic ticks per quarter note
;-----------------------------
#TicDiBasePerQuarto=192
;---------------------------------
;basic ticks per sixtyfourth note
;---------------------------------
#TicDiBasePerSessantaquattresimo=#TicDiBasePerQuarto/16
;---------------
;tracks maximum
;---------------
#MassimoTracce=1024
;------------------
;sequences maximum
;------------------
#MassimoSequenze=32768
#LarghezzaPulsantiEditoreSequenza=16*16+8*5
; font height, notes invisible area, selected channel, note increment y, basic event,musical event moved by mouse
DEFTYPE .b AltezzaFonte,AreaInvisibileDelleNote,CanaleSelezionato,IncrementoYNota, EventoBase, EventoMusicaleSpostatoConIlTopo
; speech enabled, clicked mouse key, ticks per sixtyfourth note,visible tracks,AMIGA voice off,visible area start y
DEFTYPE .b ParlatoAttivato,TastoDelTopoCliccato,TicPerSessantaquattresimo ,TracceVisibili,VoceSpenta, YInizioAreaVisibile
; editor window inner height, editor window inner width
DEFTYPE .w AltezzaInternaFinestraEditoreSequenza,LarghezzaInternaFinestraEditoreSequenza
; main window inner height, main window inner width
DEFTYPE .w AltezzaInternaFinestraPrincipale,LarghezzaInternaFinestraPrincipale
; screen height, values visible area, Active channels,selected musical event, screen height, slider width
DEFTYPE .w AltezzaSchermo,AreaVisibileDeiValori,CanaliAttivati, EventoMusicaleSelezionato,LarghezzaSchermo,XLunSlider
; bars per mins background x,tempo background x,mouse x,slider height,tempo background y,bars per mins background y
DEFTYPE .w XPosSfondoBattutePerMinuto,XPosSfondoTempo, XTopo, YLunSlider, YPosSfondoTempo, YPosSfondoBattutePerMinuto
; mouse y
DEFTYPE .w YTopo
; time invisible area, sequence duration,events,selected events, MIDI enabled,Insertion point, sequence
DEFTYPE .l AreaInvisibileDelTempo,DurataSequenza, Eventi,EventiSelezionati,MIDIAttivato,PuntoDInserimento,Sequenza
; selected sequence, visible area start x
DEFTYPE .l SequenzaSelezionata,XInizioAreaVisibile
;----------------------------------------------------------
;questa variabile riporta la parte non visibile del motivo
;this variable reports the non visible motive area
;--------------------------------------------------
AreaInvisibileDelMotivo.l=0
;-----------------------------------------------------------------------------
;questa variabile indica la velocita' di esecuzione delle note, indicata come
; battute al minuto
;this variable states the notes execution velocity, stated as bars per minute
;-----------------------------------------------------------------------------
BattutePerMinuto.w=120
;-----------------------------------------------------
;questa variabile indica i battiti correnti del tempo
;this variable states the time's current beats
;----------------------------------------------
Battiti.b=#BattitiDiBase
;----------------------------------------------------------------------------
;la seguente variabile permette la selezione delle due diverse tavolozze dei
; colori; se vera (true), i colori saranno quelli originali, se falsa (false)
; saranno quelli dell'immagine di sfondo a colori
;the following variable permits the selection of the two different colour
; palettes; if true the colours will be as original, if false they will be
; the ones from the coloured pic
;--------------------------------
ColoriOriginali.b=False
;----------------------------------------------------------------------------
;questa costante indica il valore per cui bisogna moltiplicare o dividere la
; frequenza della nota per ricavare rispettivamente la nota successiva o la
; nota precedente e corrisponde a 2^(1/12), cioe' la radice dodicesima di 2
;this constant states the value witch it must moltiply or divide the note
; frequency to obtain respectively the following note or the previous note and
; corresponds to 2^(1/12), that is the twelfth root of 2
;--------------------------------------------------------
DistanzaSemitono.f=1.05946309
;------------------------------------------------------------------------------
;questa variabile, diventando vera (true), vi permette di uscire dal programma
;this variable, becaming True, let you exit from the program
;------------------------------------------------------------
EsciDalProgramma.b=False
;------------------------------------------
;questa variabile indica la fine del brano
;this variable states song end
;------------------------------
FineMotivo.l=0
;------------------------------------------------------------------
;questa variabile indica se e' stata aperta la finestra principale
;this flag states if the main window is opened
;----------------------------------------------
FinestraPrincipaleAperta.b=False
;------------------------------------------------------------------------------
;Questa variabile indica la larghezza di base delle note; puo' essere cambiata
; secondo i bisogni del momento
;This variable states the basic notes width; it can be changed depending of
; the needs of the moment
;-------------------------
LarghezzaEventoBase.w=#TicDiBasePerQuarto
;-----------------------------------------------------
;questa variabile indica le misure correnti del tempo
;this variable states the time's current measures
;-------------------------------------------------
Misure.b=#MisureDiBase
;--------------------------------------------------------------------------
;questa variabile indica se gli eventi musicali dello stesso canale devono
; essere mostrati da soli nell'editore sequenza
;this variable states if the same channel musical events must be shown alone
; in the sequence editor
;------------------------
MostraSoloGliEventiMusicaliDelCanaleSelezionato.b=False
;------------------------------------------------------------------------
;questa variabile indica se gli eventi musicali dello stesso tipo devono
; essere mostrati da soli nell'editore sequenza
;this variable states if the same kind musical events must be shown alone in
; the sequence editor
;---------------------
MostraSoloGliEventiMusicaliDelloStessoTipo.b=False
;----------------------------------------------------------------------------
;questa variabile indica se deve essere mostrato il nuovo valore dell'evento
; selezionato mosso con il mouse
;this variable states if the new value of the selected event dragged by mouse
; must be showed or not
;-----------------------
MostraNuovoValore.b=False
;---------------------------------------------------------------------------
;questa variabile sara' maggiore di zero se una nota non e' stata terminata
;this variable will be greater than zero if one or more notes have not been
; terminated
;------------
NoteSuonate.l=0
;--------------------------------------------------------------------
;questa variabile indica l'ottava visualizzata nell'editore sequenza
;this variable states the visualized octave in the sequence editor
;------------------------------------------------------------------
OttavaSelezionata.b=#_MiddleC/12
;-------------------------------------------
;questa variabile indica la sequenza in uso
;this variable states the sequence in use
;-----------------------------------------
Sequenza.l=0
;--------------------------------------------------------------------------
;questa variabile indica la scala di visualizzazione delgi eventi musicali
; dell'editore sequenza
;this variable states the musical events visualization scale of the sequence
; editor
;--------
ScalaEventiMusicali.w=1
;--------------------------------------------------------------------------
;questa variabile indica la sequenza selezionata; se contiene zero nessuna
; sequenza e' selezionata, altrimenti contiene il numero positivo che
; identifica la sequenza
;this variable states the selected sequence; if retains zero no sequence is
; selected, otherwise retain the positive number that identifies the sequence
;-----------------------------------------------------------------------------
SequenzaSelezionata=0
;-------------------------------------------------------------------------
;questa variabile indica se la lista degli ultimi 5 file midi caricati e'
; stata scritta
;this flag states if the last 5 loaded MIDI files list has been written
;-----------------------------------------------------------------------
StoriaDeiFileMIDIAperti.b=False
;------------------------------------------------------------------------------
;La nota base, il quarto, corrisponde a 192 tic; questa costante indica quanti
; tic passano in un 50mo di secondo per un tempo di 120 battute per minuto
;The basic note, the quarter, corresponds to 192 ticks; this constant signs
; how many ticks takes passes in a 50th of a second for a time of 120 measures
; per minutes
;-------------
TicPerCinquantesimoDiSecondo.f=30.72
;--------------------------------------------------------------------------
;la seguente variabile stringa indica il tipo di evento musicale corrente;
; all'inizio e' impostata sull'evento nota
;the following string variable states the current musical event; at the
; beginning is set on the note event
;------------------------------------
TipoDiEventoMusicaleDiBase$="Note"
;------------------------------------------------------------------------------
;questa variabile indica per le note la velocita' di base e per i controlli il
; valore di base; valore utile da zero a 127
;this variable states for the notes the basic velocity and for the controls
; the basic value; useful value from zero to 127
;------------------------------------------------
ValoreEventoBase.b=64
;-----------------------------------------------------------------------
;questa variabile indica la posizione della voce Quit del menu' Project
;this variable marks the position of voice Quit in the Project menu
;-------------------------------------------------------------------
VoceMenuEsci.b=4
;-------------------------------------------------------------------------
;questa variabile indica la voce dell'AMIGA che non e' attiva; ogni "uno"
; corridponde ad una voce di Amiga
;this variable states the Amiga voice that is not active; each "one" is
; related to an AMIGA voice
;---------------------------
VoceSpenta=%1111
;---------------------------------------------------------------------------
;questa variabile indica la posizione d'inizio per la visualizzazione delle
; tracce
;this variables states the start position for the tracks displaying
;-------------------------------------------------------------------
XTracceVisibili.l=0
;------------------------------------------------------------
;questa variabile memorizza la prima traccia da visualizzare
;this variable stores the first track to be displayed
;-----------------------------------------------------
YTracceVisibili.w=0
;---------------------------------------------------------------------------
;queste cinque variabili indicizzate conterranno i nomi degli ultimi 5 file
; MIDI caricati
;this five indexed variables will keep names of last 5 loaded MIDI files
;------------------------------------------------------------------------
Dim FileMIDIAperto$(4)
;-----------------------------------------------------------------------------
;questa struttura di variabili e' una tabella di riferimento per il periodo e
; la frequenza associati ad ognuna delle 128 note possibili
;this variables structure is a refferring table for the periode and frequency
; paired to every one of the 128 given notes
;--------------------------------------------
NEWTYPE .PeriFreq
;--------
;periode
;--------
Periodo.l
;----------
;frequency
;----------
Frequenza.f
End NEWTYPE
Dim PeriFreq.PeriFreq(127)
;--------------------------------------------------------------------------
;la seguente struttura di variabili serve per identificare il tipo di note
;the following variables structure is used to states the notes kind
;-------------------------------------------------------------------
NEWTYPE .TipoDiNota
;note italian name
NomeItaliano$
;note english name
NomeInglese$
;diesis flag
Diesis.b
;note octave
Ottava.b
End NEWTYPE
Dim TipoDiNota.TipoDiNota(127)
;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione dei suoni per l'Amiga
;the following variables structure is for Amiga sounds management
;-----------------------------------------------------------------
NEWTYPE .Suono
;---------------------------------------------------
;questa variabile indica il nome del suono caricato
;this variable states the name of the loaded sound
;--------------------------------------------------
Nome$
;----------------------------------------------------------------------------
;questa variabile indica il canale associato al suono caricato; valore utile
; da 1 a 16, o zero se nessun canale e' associato al suono
;this variable states the channel linked to the loaded sound; useful value
; from 1 to 16, or zero if no channel is assigned to the sound
;--------------------------------------------------------------
Canale.b
End NEWTYPE
Dim Suono.Suono(31)
NEWTYPE .Sequenza
;--------------------------------------------------
;questa variabile memorizza il nome della sequenza
;this variable stores the sequence name
;---------------------------------------
Nome$
;----------------------------------------------------------
;questa variabile indica l'inizio temporale della sequenza
;this variable states the sequence time start
;---------------------------------------------
Inizio.l
;-----------------------------------------------------------
;questa variabile indica la durata temporale della sequenza
;this variable states the sequence time duration
;------------------------------------------------
Durata.l
;--------------------------------------------------------------------
;questa variabile indica la traccia di appartenenenza della sequenza
;this variable states the track that the sequence is belonging to
;-----------------------------------------------------------------
Traccia.w
;------------------------------------------------------------------
;questa variabile indica gli eventi musicali totali della sequenza
;this variable states the sequence's total musical events
;---------------------------------------------------------
EventiMusicali.l
;-----------------------------------------------------------------------
;questa variabile indica gli eventi musicali selezionati della sequenza
;this variable states the sequence's selected musical events
;------------------------------------------------------------
EventiMusicaliSelezionati.l
End NEWTYPE
Dim List Sequenza.Sequenza(#MassimoSequenze-1)
;------------------------------------------------------------------------
;queste variabili indicizzate indicano True (Vero) se la traccia esiste,
; altrimenti indicano False (Falso)
;these indexed variables (arrays) state True if track exist, otherwise state
; False
;-------
Dim Traccia.b(#MassimoTracce-1)
;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione degli eventi musicali
;the following vars structure is for the musical events management
;------------------------------------------------------------------
NEWTYPE .EventoMusicale
;----------------------------------------------------------------------------
;questa variabile stringa indica il tipo di evento musicale, che puo' essere
; una nota od un parametro MIDI
;This string variable states the musical event kind, that can be a note or a
; MIDI parameter
;----------------
Tipo$
;-----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica l'altezza;
; valore utile da zero a 127
;if the event is a note, this variable states its height; useful value from
;zero to 127
;------------
Evento.b
;--------------------------------------------------------------------------
;se l'evento musicale e'una nota, questa variabile ne indica l'intensita',
;cioe' il suo volume; se invece l'evento e' un controllo ne indica il valore
;if the musical event is a note, this variable states its intensity, that is
; its volume; if instead is a control it states its value
;---------------------------------------------------------
Valore.b
;----------------------------------------------------------------------------
;questa variabile indica la posizione dell'evento musicale nel tempo in tic;
; valore utile da zero a 2 miliardi e rotti
;this variable states musical event position in time by ticks; useful value
;from zero to over 2 billions
;-----------------------------
Inizio.l
;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica in tic la durata
; nel tempo; valore utile da 0 a 2 miliardi e rotti (192 tic=nota di un quarto)
;if the event is a note, this variable states its duration in time by ticks;
;useful value from zero to over 2 billions (192 ticks=a quarter note)
;---------------------------------------------------------------------
Durata.l
;------------------------------------------------------------------------------
;questa varibile indica il canale dell'evento musicale; valore utile da 1 a 16
;this variable states musical event's channel; useful value from 1 to 16
;------------------------------------------------------------------------
Canale.b
;-----------------------------------------------------------------------------
;questa variabile identifica la sequenza di appartenenza dell'evento musicale
; valore utile da 1 a 32768
;this variable states the sequence witch the musical event belong to: useful
; value from 1 to 32768
;-----------------------
Sequenza.l
;----------------------------------------------------------------------------
;questa variabile indica se l'evento musicale e' stato selezionato, tagliato
; copiato, eseguito o terminato, piu' precisamente:
; 0=evento non selezionato
; 1=evento selezionato
; +2=evento tagliato
; +4=evento copiato
; +8=evento eseguito
; +16=evento terminato
;this variable states if the musical event has been selected, cutted, copied
; executed or terminatted, more precisely:
; 0=unselected event
; 1=selected event
; +2=cutted event
; +4=copied event
; +8=executed event
; +16=ended event
;-----------------
Stato.b
End NEWTYPE
DEFTYPE .EventoMusicale NotaSuonata
;-----------------------------------------------------
;imposta il numero massimo di eventi musicali usabili
;sets the maximun musical events handling
;-----------------------------------------
MassimoEventiMusicali.l=Min((FastFree-65536)/SizeOf .EventoMusicale,32768)
;---------------------------------------------------------------------------
;crea le variabili array lista con la struttura del NEWTYPE .EventoMusicale
;creates the list array variables with the NEWTYPE .EventoMusicale structure
;----------------------------------------------------------------------------
Dim List EventoMusicale.EventoMusicale(MassimoEventiMusicali-1)
;-----------------------------------------------------------------
;questa variabile indica se e' stato attivato un dispositivo MIDI
;this variable states if a MIDI device has been activated
;---------------------------------------------------------
MIDIAttivato.l=0
;------------------------------------------------------------------------------
;questa variabile indica se si entra nell'editore sequenza per la prima volta,
; per mostrare i requester che riportano i tasti utili
;this variable states if you enters in the sequence editor for the first time,
; to show the requesters that show the useful keys
;--------------------------------------------------
PrimaVoltaNellEditoreSequenza.b=True
;--------------------------------------------------------------------------
;questa procedura imposta la fonte di caratteri Topaz8 per schermo, menu e
; requester, ma non per le finestre
;this procedure sets the characters font Topaz8 for screen, menus and
; requester, but not for windows
;--------------------------------
Statement CaricaLaFonteDiCaratteriTopaz8{}
SHARED AltezzaFonte
AltezzaFonte=8:LoadFont #FonteDiCaratteriTopaz8,"topaz.font",AltezzaFonte
End Statement
;------------------------------------------------------------
;questa procedura imposta il parlato dell'AMIGA se possibile
;this procedure sets the AMIGA speech if it is possible
;-------------------------------------------------------
Statement ImpostaIlParlatoDellAmiga{}
SHARED ParlatoAttivato
If Exists("LIBS:translator.library") AND Exists("DEVS:narrator.device")
SetVoice 130,250,0,1,64,22200
Speak "Speech is enabled!"
ParlatoAttivato=True
Else
Messaggio$="Unable to set speech,|"
Messaggio$+"required files:|"
Messaggio$+"LIBS:translator.library|"
Messaggio$+"DEVS:narrator.device|"
Messaggio$+"These are supplied with|"
Messaggio$+"the workbench 1.2|"
Messaggio$+"Search on Aminet their|"
Messaggio$+"third part improvement|"
EZRequest "AmySequencer message",Messaggio$,"OK"
ParlatoAttivato=False
EndIf
End Statement
;-----------------------------------------------
;questa procedura carica le immagini delle note
;this procedure loads the note images
;-------------------------------------
Statement CaricaLeImmaginiDelleNote{}
BitMap 0,126,16,1
LoadBitMap 0,"Notes.2Cols"
GetaShape 0,0,0,22,16
GetaShape 1,23,0,12,16
GetaShape 2,36,0,12,16
GetaShape 3,49,0,17,16
GetaShape 4,67,0,17,16
GetaShape 5,85,0,17,16
GetaShape 6,103,0,17,16
GetaShape 7,121,0,5,16
Free BitMap 0
End Statement
;----------------------------------------------
;questa procedura attiva la comunicazione MIDI
;this procedure activates the MIDI communication
;------------------------------------------------
Statement AttivaMIDI{}
SHARED MIDIAttivato
Use Window #FinestraPrincipale
WJam #DueColoriConSfondoPieno
Repeat
If MIDIAttivato=True Then CloseSerial 0
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Please type your MIDI device name>"
DispositivoMIDI$=StripLead$(StripTrail$(Edit$("serial.device",35),Asc(" ")),Asc(" "))
WLocate 0,0:Print SPACE$(80)
If DispositivoMIDI$<>""
MIDIAttivato=OpenSerial(DispositivoMIDI$,0,31250,16)
If MIDIAttivato=0
EZRequest "AmySequencer message","Unable to open MIDI|on "+DispositivoMIDI$,"OK"
Else
SetSerialBuffer 0,64
MIDIAttivato=True
EndIf
EndIf
Until MIDIAttivato=True
EZRequest "AmySequencer message","MIDI has been activated|on "+DispositivoMIDI$,"OK"
WJam #UnColoreConSfondoTrasparente
End Statement
;-------------------------------------------------
;questa procedura cambia la misurazione del tempo
;this procedure change the time misuration
;------------------------------------------
Statement CambiaLaMisuraDelTempo{}
SHARED Battiti
SHARED Misure
Use Window #FinestraPrincipale
WJam #DueColoriConSfondoPieno
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Please type the basic time beat>"
Battiti=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
Battiti=Min(Max(Battiti,1),16)
WLocate 0,0:Print SPACE$(80)
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Please type the basic time measures>"
Misure=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
Misure=Min(Max(Misure,1),8)
WJam #UnColoreConSfondoTrasparente
End Statement
;--------------------------------------------------------
;questa procedura mostra gli eventi musicali disponibili
;this procedure shows the available musical events
;--------------------------------------------------
Statement MostraGliEventiMusicaliDisponibili{}
SHARED MassimoEventiMusicali
SHARED Sequenza()
SHARED TotaleEventiMusicali
Sequenze.w=0
TotaleEventiMusicali=0
PushItem Sequenza()
ResetList Sequenza()
While NextItem(Sequenza())=True
If Sequenza()\Durata>0
TotaleEventiMusicali+Sequenza()\EventiMusicali
Sequenze+1
EndIf
Wend
PopItem Sequenza()
WLocate 0,0:WColour 3,0:Print MassimoEventiMusicali," events allocated, ",TotaleEventiMusicali," event"
If TotaleEventiMusicali<>1 Then Print "s"
Print " used, "
If Sequenze>0
Print Str$(Sequenze)," sequence":If Sequenze>1 Then Print "s"
Else
Print "no sequences"
EndIf
End Statement
;-------------------------------------------------------------------
;mostra la velocita' di esecuzione delle note in battute per minuto
;shows the execution velocity in measures per minute
;----------------------------------------------------
Statement MostraLeBattutePerMinuto{BattutePerMinuto.w,CanaleEvento.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED XPosSfondoBattutePerMinuto
SHARED YPosSfondoBattutePerMinuto
TicPerCinquantesimoDiSecondo.f=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
WJam #DueColoriConSfondoPieno
If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
XMessaggio.w=0
YMessaggio.w=AltezzaInternaFinestraPrincipale-8-8
WLocate XMessaggio,YMessaggio
Print SPACE$(Len("BPM>000-ticks/50th>000.0"))
WBlit 8,XPosSfondoBattutePerMinuto,YPosSfondoBattutePerMinuto
WJam #UnColoreConSfondoTrasparente:WColour 3
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
WColour CanaleEvento-1,16-CanaleEvento
XMessaggio=#LarghezzaPulsantiEditoreSequenza
YMessaggio=AltezzaInternaFinestraEditoreSequenza-8
Print SPACE$(80-XMessaggio/8)
EndIf
WLocate XMessaggio,YMessaggio
Format "000":Print "BPM>",BattutePerMinuto
Format "000.0":Print"-ticks/50th>",TicPerCinquantesimoDiSecondo
Format ""
End Statement
;------------------------------------------------------
;questa procedura mostra il tempo in battiti su misure
;this procedure shows the tempo by beats per measures
;-----------------------------------------------------
Statement MostraIlTempo{Tempo.b,CanaleEvento.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
WJam #DueColoriConSfondoPieno
If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
XMessaggio.w=(80-Len("Tempo00/00"))*8
YMessaggio.w=AltezzaInternaFinestraPrincipale-8-8
WLocate XMessaggio,YMessaggio
Print SPACE$(Len("Tempo00/00"))
WBlit 9,XPosSfondoTempo,YPosSfondoTempo
WJam #UnColoreConSfondoTrasparente:WColour 3
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
WColour CanaleEvento-1,16-CanaleEvento
XMessaggio=#LarghezzaPulsantiEditoreSequenza
YMessaggio=AltezzaInternaFinestraEditoreSequenza-8
Print SPACE$(80-XMessaggio/8)
EndIf
WLocate XMessaggio,YMessaggio
Format "00":Print "Tempo",Str$(Tempo MOD 16+1),"/",Str$(Tempo/16+1):Format ""
End Statement
;----------------------------------------------------------------------------
;questa procedura crea una tabella di riconoscimento delle note, memorizzata
; nell'array TipoDiNota()
;this procedure crates a referring note recognition table, stored in the
; TipoDiNota() array (that means Note Kind)
;-------------------------------------------
Statement ImpostaIlTipoDiNota{Nota.b}
SHARED TipoDiNota()
;--------------------------------------------
;questa variabile indica l'ottava della nota
;this variable state the note octave
;------------------------------------
OttavaDellaNota.b=Nota/12
TipoDiNota(Nota)\Ottava=OttavaDellaNota
;-----------------------------------------------------------------------
;questa variabile indica a quali delle 12 note dodici note fondamentali
; corrisponde la nota corrente
;this variable marks which of 12 fundamental notes corresponds the current
; note
;------
NotaNellOttava.b=Nota MOD 12
Select NotaNellOttava
;------------------
;la nota e' un Do?
;is the given note a C?
;-----------------------
Case 0
TipoDiNota(Nota)\NomeItaliano="Do"
TipoDiNota(Nota)\NomeInglese="C"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Do diesis (Do#)?
;is the given note a C diesis (C#)?
;-----------------------------------
Case 1
TipoDiNota(Nota)\NomeItaliano="Do#"
TipoDiNota(Nota)\NomeInglese="C#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Re?
;is the given note a D?
;-----------------------
Case 2
TipoDiNota(Nota)\NomeItaliano="Re"
TipoDiNota(Nota)\NomeInglese="D"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Re diesis (Re#)?
;is the given note a D diesis (D#)?
;-----------------------------------
Case 3
TipoDiNota(Nota)\NomeItaliano="Re#"
TipoDiNota(Nota)\NomeInglese="D#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Mi?
;is the given note a E?
;-----------------------
Case 4
TipoDiNota(Nota)\NomeItaliano="Mi"
TipoDiNota(Nota)\NomeInglese="E"
TipoDiNota(Nota)\Diesis=False
;------------------
;la nota e' un Fa?
;is the given note a F?
;-----------------------
Case 5
TipoDiNota(Nota)\NomeItaliano="Fa"
TipoDiNota(Nota)\NomeInglese="F"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un Fa diesis (Fa#)?
;is the given note a F diesis (F#)?
;-----------------------------------
Case 6
TipoDiNota(Nota)\NomeItaliano="Fa#"
TipoDiNota(Nota)\NomeInglese="F#"
TipoDiNota(Nota)\Diesis=True
;-------------------
;la nota e' un Sol?
;is the given note a G?
;-----------------------
Case 7
TipoDiNota(Nota)\NomeItaliano="Sol"
TipoDiNota(Nota)\NomeInglese="G"
TipoDiNota(Nota)\Diesis=False
;---------------------------------
;la nota e' un Sol diesis (Sol#)?
;is the given note a G diesis (G#)?
;-----------------------------------
Case 8
TipoDiNota(Nota)\NomeItaliano="Sol#"
TipoDiNota(Nota)\NomeInglese="G#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un La?
;is the given note an A?
;------------------------
Case 9
TipoDiNota(Nota)\NomeItaliano="La"
TipoDiNota(Nota)\NomeInglese="A"
TipoDiNota(Nota)\Diesis=False
;-------------------------------
;la nota e' un La diesis (La#)?
;is the given note an A diesis (A#)?
;------------------------------------
Case 10
TipoDiNota(Nota)\NomeItaliano="La#"
TipoDiNota(Nota)\NomeInglese="A#"
TipoDiNota(Nota)\Diesis=True
;------------------
;la nota e' un Si?
;is the given note a B?
;-----------------------
Case 11
TipoDiNota(Nota)\NomeItaliano="Si"
TipoDiNota(Nota)\NomeInglese="B"
TipoDiNota(Nota)\Diesis=False
End Select
End Statement
Statement CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
SHARED PeriFreq()
SHARED DistanzaSemitono
;-------------------------------------------------------------------------
;per ottenere la frequenza di tutte le 128 note, si parte dal La della 4a
; ottava (la prima e' l'ottava zero), la cui frequenza e' nota e la si
; moltiplica o divide per la distanza minima tra due note che e' il semitono;
; per ottenere il periodo si divide una delle costanti di temporizzazione, a
; seconda che il il proprio AMIGA usi uno schermo PAL o NTSC, per la frequenza
; della nota; queste costanti sono riportate sul MANUALE DI RIFERIMENTO PER
; L'HARDWARE AMIGA
;to obtain all 128 notes it starts from the A from the 4rd octave (the 1st is
; the zero octave) that has a known frequency, and it multiply or divide this
; for the minimum distance between two notes that is the semitone; to obtain
; the period it divides one of the timing constants, depending on your AMIGA
; uses a PAL or NTSC screen, for the note frequency; these constants are
; reported on the AMIGA HARDWARE REFERENCE MANUAL
;-------------------------------------------------
PeriFreq(45)\Frequenza=440
If NTSC=True
PeriFreq(45)\Periodo=#TemporizzazioneNTSC/PeriFreq(45)\Frequenza
Else
PeriFreq(45)\Periodo=#TemporizzazionePAL/PeriFreq(45)\Frequenza
EndIf
ImpostaIlTipoDiNota{45}
For Nota.w=46 To 127
PeriFreq(Nota)\Frequenza=PeriFreq(Nota-1)\Frequenza*DistanzaSemitono
If NTSC=True
PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
Else
PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
EndIf
ImpostaIlTipoDiNota{Nota}
Next Nota
For Nota=44 To 0 Step -1
PeriFreq(Nota)\Frequenza=PeriFreq(Nota+1)\Frequenza/DistanzaSemitono
If NTSC=True
PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
Else
PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
EndIf
ImpostaIlTipoDiNota{Nota}
Next Nota
End Statement
;------------------------------------------------------------------------------
;la seguente procedura converte un valore temporale da tic in battute, battiti
; e tic; la variabile OrigineZero serve per la differente visualizzazione
; della durata delle note che, se vera, parte da zero
;the following procedure converts a time value from ticks into bars, beats and
; ticks; the OrigineZero variable is used for the different note length
; displacement that, if this is true, starts from zero instead of starting
; from one
;----------
Statement ConvertiIlTempoInBattute{Tempo.l,Battiti.b,Misure.b,OrigineZero.b}
If OrigineZero=True
Battuta.l=Tempo/(#TicDiBasePerQuarto*4.0*Battiti)/Misure
Battito.b=(Tempo/(#TicDiBasePerQuarto/(Misure/4.0))) MOD Battiti
Else
Battuta=Tempo/(#TicDiBasePerQuarto*4.0*Battiti)/Misure+1
Battito=(Tempo/(#TicDiBasePerQuarto/(Misure/4.0))) MOD Battiti+1
EndIf
Print Battuta,".",Battito
Tic.w=Tempo MOD (#TicDiBasePerQuarto/(Misure/4.0))
If Tic>0 Then Print ".",Tic
End Statement
;-------------------------------------------------
;questa procedura imposta le barre di scorrimento
;this procedure sets sliders
;----------------------------
Statement ImpostaSlider{Slider.l,XPos.w,YPos.w,Orientamento$,Parametri.l,ListaGadgetSlider.l}
SHARED XLunSlider
SHARED YLunSlider
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL" Then Parametri+#MovimentoOrizzontale
If Orientamento$="VERTICAL" Then Parametri+#MovimentoVerticale
PropGadget ListaGadgetSlider,XPos,YPos,Parametri,Slider,XLunSlider,YLunSlider
End Statement
;------------------------------------------------
;questa procedura mostra le barre di scorrimento
;this procedure showss the sliders
;----------------------------------
Statement MostraSlider{Slider.l,ValoreDato.l,ValoreMassimo.l,Orientamento$,ListaGadgetSlider.l,FinestraSlider.l}
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL"
SetHProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
EndIf
If Orientamento$="VERTICAL"
SetVProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
EndIf
Redraw FinestraSlider,Slider
End Statement
;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manage the sliders
;----------------------------------
Function .l ValoreSlider{Slider.l,ValoreMassimo.l,LunghezzaSlider.l,Orientamento$,ListaGadgetSlider.l}
Orientamento$=UCase$(Orientamento$)
If Orientamento$="HORIZONTAL"
ValoreSlider.f=HPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
ValoreIndicatoDalTopo.w=EMouseX*ValoreMassimo/LunghezzaSlider
EndIf
If Orientamento$="VERTICAL"
ValoreSlider=VPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
ValoreIndicatoDalTopo=EMouseY*ValoreMassimo/LunghezzaSlider
EndIf
ValoreIndicatoDalloSlider.l=Int(ValoreSlider)
If ValoreIndicatoDalTopo>ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider+1
If ValoreIndicatoDalTopo<ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider-1
ValoreIndicatoDalloSlider=Min(Max(ValoreIndicatoDalloSlider,0),ValoreMassimo)
Function Return ValoreIndicatoDalloSlider
End Function
;---------------------------------------------------------------------------
;questa procedura cancella il file storico degli ultimi 5 MIDI file aperti
;this procedure clears the last 5 loaded MIDI files history file
;----------------------------------------------------------------
Statement CancellaLaStoriaDeiFileMIDIAperti{}
SHARED FileMIDIAperto$()
SHARED StoriaDeiFileMIDIAperti
SHARED VoceMenuEsci
KillFile "LoadedMIDIFilesHistory"
VoceMenuEsci=4
StoriaDeiFileMIDIAperti=False
For FileMIDIAperto.b=0 To 4
FileMIDIAperto$(FileMIDIAperto)=""
Next FileMIDIAperto
End Statement
;------------------------------------------------------------------------
;questa procedura carica il file storico degli ultimi 5 file MIDI aperti
;this procedure loads the last 5 loaded MIDI files history file
;---------------------------------------------------------------
Statement CaricaLaStoriaDeiFileMIDIAperti{}
SHARED FileMIDIAperto$()
SHARED StoriaDeiFileMIDIAperti
SHARED VoceMenuEsci
StoriaDeiFileMIDIAperti=ReadFile(0,"LoadedMIDIFilesHistory")
If StoriaDeiFileMIDIAperti=True
FileInput 0
FileMIDIAperto.b=0
Repeat
Dato$=Inkey$
If Dato$=Chr$(10)
FileMIDIAperto+1
VoceMenuEsci+1
Else
FileMIDIAperto$(FileMIDIAperto)+Dato$
EndIf
Until Dato$=""
CloseFile 0
PopInput
EndIf
End Statement
;------------------------------------------------------------------
;crea la bitmap per l'immagine di sfondo della finestra principale
;creates the bitmap for the background pic of the main window
;-------------------------------------------------------------
Statement CreaLaBitmapPerLImmagineDiSfondo{}
;----------------------------------------
;crea la bitmap per l'immagine di sfondo
;creates the bitmap for the background pic
;------------------------------------------
BitMap #BitmapImmagineDiSfondo,640,240,4
End Statement
;-------------------------------------------------------------------
;carica l'immagine di sfondo della finestra principale nella bitmap
;loads the background pic of the main window into the bitmap
;------------------------------------------------------------
Statement CaricaLImmagineDiSfondoNellaBitmap{}
SHARED ColoriOriginali
If ColoriOriginali=True
ImmagineDiSfondo$="BackPicOC.16Cols"
Else
ImmagineDiSfondo$="BackPic.16Cols"
EndIf
;----------------------------------------------------------------------------
;carica l'immagine di sfondo per la finestra principale nella bitmap creata
; per questa
;loads the main window background image into the bitmap creted for it
;---------------------------------------------------------------------
LoadBitMap #BitmapImmagineDiSfondo,ImmagineDiSfondo$,#TavolozzaDeiColori
;---------------------------------------------------
;usa la tavolozza dei colori dell'immagine caricata
;use loaded image colours palette
;---------------------------------
Use Palette #TavolozzaDeiColori
End Statement
;------------------------------------
;questa procedura imposta lo schermo
;this procedure sets the screen
;-------------------------------
Statement ImpostaLoSchermo{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED TracceVisibili
;--------------------------------------
;imposta la fonte di caratteri globale
;sets the global characters font
;--------------------------------
Use IntuiFont #FonteDiCaratteriTopaz8
;------------------------------------
;inizializza la tavolozza dei colori
;initializes the colours palette
;--------------------------------
InitPalette #TavolozzaDeiColori,16
;-------------------------------
;carica i colori per lo schermo
;loads colours for screen
;-------------------------
; For Colore.b=0 To 15
; Read Rosso.b
; Read Verde.b
; Read Blu.b
; PalRGB #TavolozzaDeiColori,Colore,Rosso,Verde,Blu
; Next Colore
;----------------------------------------------------------------
;imposta le penne dello schermo con i migliori colori (ROM 2.0+)
;sets screen pens with best colours (ROM 2.0+)
;----------------------------------------------
ScreenPens 3,2,0,1,3,1,2
;------------------------------------------------
;apre lo schermo in alta risoluzione a 16 colori
;opens high resolution screen with 16 colours
;---------------------------------------------
Screen #Schermo,4+8,"AmySequencer by Stefano Maria Regattin"
;-----------------------------
;usa la tavolozza dei colori
;use colours palette
;--------------------
Use Palette #TavolozzaDeiColori
;-------------------------------------------------------------------------------
;questa variabile contiene l'indirizzo di memoria della struttura dello schermo
;this variable retains the screen structure memory address
;----------------------------------------------------------
IndirizzoSchermo.l=Peek.l(Addr Screen(0))
;----------------------------------------------------------
;questa variabile contiene la vera larghezza Dello schermo
;this variable retains the true screen width
;--------------------------------------------
LarghezzaSchermo=Peek.w(IndirizzoSchermo+12)
;--------------------------------------------------------
;questa variabile contiene la vera altezza dello schermo
;this variable retains the true screen height
;---------------------------------------------
AltezzaSchermo=Peek.w(IndirizzoSchermo+14)
;-------------------------------------------------------------
;questa variabile indica il massimo numero di tracce visibili
;this variable states the visible tracks maximum number
;-------------------------------------------------------
TracceVisibili=(AltezzaSchermo-(AltezzaFonte+3)-8-8-8)/8
End Statement
;-----------------------------------------------------------------------
;questa procedura mostra l'immagine di sfondo nella finestra principale
;this procedure shows the background pic into the main window
;--------------------------------------------------------------
Statement MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;---------------------------------------------------------
;copia l'immamgine dalla bitmap nella finestra principale
;copies the pic from the bitmap into the main window
;----------------------------------------------------
BitMaptoWindow #BitmapImmagineDiSfondo,#FinestraPrincipale,0,0,0,0,640,240
End Statement
Statement CopiaLoSfondoSottoAlleBattutePerMinuto{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoBattutePerMinuto
SHARED YPosSfondoBattutePerMinuto
XPosSfondoBattutePerMinuto=0
YPosSfondoBattutePerMinuto=AltezzaInternaFinestraPrincipale-8-8
XLunSfondoBattutePerMinuto.w=Len("BPM>000-ticks/50th>000.0")*8
YLunSfondoBattutePerMinuto.b=8
GetaShape 8,XPosSfondoBattutePerMinuto,YPosSfondoBattutePerMinuto,XLunSfondoBattutePerMinuto,YLunSfondoBattutePerMinuto
End Statement
Statement CopiaLoSfondoSottoAlTempo{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
XPosSfondoTempo=LarghezzaInternaFinestraPrincipale-1-(Len("Tempo>00/00")*8-1)
YPosSfondoTempo=AltezzaInternaFinestraPrincipale-8-8
XLunSfondoTempo.b=Len("Tempo>00/00")*8
YLunSfondoTempo.b=8
GetaShape 9,XPosSfondoTempo,YPosSfondoTempo,XLunSfondoTempo,YLunSfondoTempo
End Statement
;-------------------------------------------------------------------------------
;Questa procedura imposta la finestra principale invisibile e reimposta il menu
; principale
;this procedure sets the main invisible window and resets the main menu
;-----------------------------------------------------------------------
Statement ImpostaLaFinestraPrincipale{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraPrincipale
SHARED AltezzaSchermo
SHARED BattutePerMinuto
SHARED FineMotivo
SHARED FinestraPrincipaleAperta
SHARED LarghezzaInternaFinestraPrincipale
SHARED LarghezzaSchermo
SHARED FileMIDIAperto$()
SHARED StoriaDeiFileMIDIAperti
SHARED TicPerCinquantesimoDiSecondo
SHARED TracceVisibili
SHARED VoceMenuEsci
SHARED XLunSlider
SHARED YLunSlider
;-----------------------------------------------
;se la finestra era gia' stato aperto la chiude
;if window was opened it close it
;---------------------------------
If FinestraPrincipaleAperta=True
BeepScreen #Schermo
Free GadgetList #ListaGadgetPrincipale
Free MenuList #ListaMenuPrincipale
CloseWindow #FinestraPrincipale
EndIf
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
;-------------------------
;imposta il menu' Project
;sets Project menu
;------------------
MenuTitle #ListaMenuPrincipale,0,"SMFile"
MenuItem #ListaMenuPrincipale,0,0,0,"New"
MenuItem #ListaMenuPrincipale,0,0,1,"Load"
MenuItem #ListaMenuPrincipale,0,0,2,"Save"
MenuItem #ListaMenuPrincipale,0,0,3,"Save as"
If StoriaDeiFileMIDIAperti=True
For FileMIDIAperto.b=4 To VoceMenuEsci-1
MenuItem 0,0,0,FileMIDIAperto,FileMIDIAperto$(FileMIDIAperto-4)
Next FileMIDIAperto
EndIf
MenuItem 0,0,0,VoceMenuEsci,"Quit"
;--------------------------
;imposta il menu' Controls
;sets Controls menu
;------------------
MenuTitle #ListaMenuPrincipale,1,"Controls"
MenuItem #ListaMenuPrincipale,0,1,0,"Play"
MenuItem #ListaMenuPrincipale,0,1,1,"Record"
;---------------------------
;imposta il menu' Sequences
;sets Sequences menu
;--------------------
MenuTitle #ListaMenuPrincipale,2,"Sequence"
MenuItem #ListaMenuPrincipale,0,2,0,"Edit"
MenuItem #ListaMenuPrincipale,0,2,1,"Name"
;------------------------
;imposta il menu' Sounds
;sets Sounds menu
;-----------------
MenuTitle #ListaMenuPrincipale,3,"Sounds"
MenuItem #ListaMenuPrincipale,0,3,0,"Edit"
;-----------------------
;imposta il menu' Prefs
;sets Prefs menu
;----------------
MenuTitle #ListaMenuPrincipale,4,"Prefs"
MenuItem #ListaMenuPrincipale,0,4,0,"Set MIDI device"
MenuItem #ListaMenuPrincipale,1,4,1," Original colours"
MenuItem #ListaMenuPrincipale,0,4,2,"Clear loaded MIDI files history"
;-------------------------------------------------------------------
;apre la finestra principale per ricavarne la larghezza e l'altezza
;opens main window to obtain its width and height
;-------------------------------------------------
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#FinestraDiSfondo+#FinestraSenzaBordi+#FinestraAttivata
Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;-------------------------------------------------------------------------
;questa variabile conserva la larghezza interna della finestra principale
;this variable stores the inner witdh of the main window
;--------------------------------------------------------
LarghezzaInternaFinestraPrincipale.w=InnerWidth
;----------------------------------------------------------------------
;questa variabile conserva l'altezza interna della finestra principale
;this variable stores the inner height of the main window
;---------------------------------------------------------
AltezzaInternaFinestraPrincipale.w=InnerHeight
CloseWindow #FinestraPrincipale
;----------------------------------------------------------------------
;imposta la barra di scorrimento che regola la velocita' di esecuzione
;sets the slider that tunes the execution velocity
;_-------------------------------------------------
XLunSlider=LarghezzaInternaFinestraPrincipale
YLunSlider=8
ImpostaSlider{1,0,AltezzaInternaFinestraPrincipale-8,"HORIZONTAL",0,#ListaGadgetPrincipale}
;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
XLunSlider=16
YLunSlider=TracceVisibili*8
ImpostaSlider{2,0,8,"VERTICAL",0,#ListaGadgetPrincipale}
;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
XLunSlider=LarghezzaInternaFinestraPrincipale-16
YLunSlider=4
ImpostaSlider{3,16,8+TracceVisibili*8,"HORIZONTAL",0,#ListaGadgetPrincipale}
;------------------------------------------------------------------------------
;apre la finestra principale solo per il menu' come invisibile e ci attacca la
; lista dei gadget principale
;opens main window for menu usage only as invisible and it attaches the main
; gadget list
;-------------
Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetPrincipale
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuPrincipale
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #UnColoreConSfondoTrasparente
;-----------------------------------------------------------------
;le finestre di richiesta sono assegnate alla finestra principale
;the request windows are assigned to main window
;------------------------------------------------
EZOutput #FinestraPrincipale
FinestraPrincipaleAperta=True
End Statement
;---------------------------------------------------------------------------
;questa funzione converte il valore dato se oltre 127 in un valore negativo
;this function converts the given value if over 127 into the negative
; equivalent
;------------
Function.b ConvertiOltreCentoventisetteInNegativo{Dato.w}
If Dato>127 Then Dato-256
DatoConvertito.b=Dato
Function Return DatoConvertito
End Function
;--------------------------------------------------------------------------
;questa e' la funzione del panico: Premete il TASTO SINISTRO DEL MOUSE per
; rallentare la conversione del file MIDI in caricamento o premete il TASTO
; DESTRO DEL MOUSE per annullare la conversione
;this is the panic function: press the LEFT MOUSE BUTTON to slow the
; conversion of the MIDI file loading or press the RIGHT MOUSE BUTTON to abort
; the conversion
;----------------
Function .b Panico{}
Select Joyb(0)
Case #TastoSinistroPremutoDelTopo
Delay_ 50
Case #TastoDestroPremutoDelTopo
Panico.b=True
End Select
Function Return Panico
End Function
;--------------------------------------------------------------------------
;questa procedura per ora legge solo il nome di un file e o inserisce nel
; menu principale; dovrebbe caricare un progetto di AmySequencer
;this procedure till now only reads a file name and put it into the main menu
; it should load an AmySequencer project
;----------------------------------------
Statement CaricaUnFileMIDI{NomeDelFileMIDI$}
SHARED EventoMusicale()
SHARED FileMIDIAperto$()
SHARED HeaderMarker$
SHARED Sequenza()
SHARED StoriaDeiFileMIDIAperti
SHARED TicPerSessantaquattresimo
SHARED TrackMarker$
SHARED VoceMenuEsci
MaxLen P$=160
MaxLen F$=64
If NomeDelFileMIDI$=""
NomeDelFileMIDI$=FileRequest$("Load a MIDI file",P$,F$)
Else
CaricatoDalMenu.b=True
EndIf
If NomeDelFileMIDI$<>""
FileMIDIAperto.b=ReadFile(0,NomeDelFileMIDI$)
If FileMIDIAperto=True
WJam #DueColoriConSfondoPieno
FileInput 0
If Inkey$(4)=HeaderMarker$
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Recognized a MIDI file..."
Delay_ 50
If Cvl(Inkey$(4))=#MarkerLength
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Header length correct..."
Delay_ 50
If Panico{}=True Then Statement Return
TipoDiFileMIDI.b=Cvi(Inkey$(2))
WLocate 0,0:WColour 0,0:Print SPACE$(80):WLocate 0,0:WColour 3,0
Select TipoDiFileMIDI
Case #FormatZero
Print "Recognized Standard MIDI File Format 0..."
Delay_ 50
Case #FormatOne
Print "Recognized Standard MIDI File Format 1..."
Delay_ 50
Case #FormatTwo
Print "Recognized Standard MIDI File Format 2..."
Delay_50
Default
IlFileCaricatoNonEUnFileMIDI.b=True
Pop Select:Pop If:Pop If:Pop If:Goto FineCicloCaricamento
End Select
If Panico{}=True Then Statement Return
If IlFileCaricatoNonEUnFileMIDI=False
Tracce.w=Cvi(Inkey$(2))
If Tracce>0
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "There "
If Tracce=1 Then Print "is one track..." Else Print "are ",Tracce," tracks..."
Delay_ 50
If Tracce>1 AND TipoDiFileMIDI=0
IlFileCaricatoNonEUnFileMIDI=True
Pop If:Pop If:Pop If:Pop If:Pop If:Pop If:Goto FineCicloCaricamento
EndIf
If IlFileCaricatoNonEUnFileMIDI=False
TicPerQuarto.w=Cvi(Inkey$(2))
If TicPerQuarto<0
EZRequest "AmySequencer message","SMPTE timing not supported yet","OK"
Statement Return
EndIf
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Ticks per quarter note: ",TicPerQuarto
If Panico{}=True Then Statement Return
TicPerSessantaquattresimo=TicPerQuarto/16
For Traccia.w=0 To Tracce-1
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,":"
If Panico{}=True Then Statement Return
If AddItem(Sequenza())=True
Sequenza.l=Traccia+1
Sequenza()\Traccia=Traccia+1
Sequenza()\Durata=#TicDiBasePerQuarto
If Inkey$(4)=TrackMarker$
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": found track header..."
If Panico{}=True Then Statement Return
LunghezzaTraccia.l=Asc(Inkey$)*256^3+Asc(Inkey$)*256^2+Asc(Inkey$)*256+Asc(Inkey$)
If LunghezzaTraccia>0
ContatoreByteTraccia.l=0
InizioEvento.l=0
InizioTraccia.b=True
PosizioneEvento.l=0
Repeat
Repeat
DeltaPosizioneEvento.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
FineDeiDeltaPosizioneEvento.b=DeltaPosizioneEvento BitTst 7
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
If FineDeiDeltaPosizioneEvento=True
Print " another event position value to add search..."
Else
Print " this was the last event position value to add..."
EndIf
If Panico{}=True Then Statement Return
DeltaPosizioneEvento BitClr 7
PosizioneEvento+DeltaPosizioneEvento
ContatoreByteTraccia+1
Until FineDeiDeltaPosizioneEvento=False
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " status byte search..."
If Panico{}=True Then Statement Return
NuovoByteDiStato.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
If NuovoByteDiStato<>#MetaEvent
If NuovoByteDiStato<0 Then ByteDiStato.b=NuovoByteDiStato
If AddItem(EventoMusicale())=True
InizioEvento=(PosizioneEvento/TicPerSessantaquattresimo)*#TicDiBasePerSessantaquattresimo
If InizioTraccia=True
Sequenza()\Inizio=InizioEvento:InizioEvento=0:InizioTraccia=False
EndIf
TipoDiEventoMusicale.b=ByteDiStato & #_StatusBits
CanaleEvento.b=ByteDiStato & #_ChannelBits+1
Select TipoDiEventoMusicale
Case #_NoteOn
TipoDiEventoMusicale$="Note"
If NuovoByteDiStato>-1
Evento.b=NuovoByteDiStato
Else
Evento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
EndIf
ValoreEvento.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " note on value found..."
If Panico{}=True Then Statement Return
Case #_NoteOff
TipoDiEventoMusicale$="NoteOff"
If NuovoByteDiStato>-1
Evento=NuovoByteDiStato
Else
Evento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
EndIf
ValoreEvento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " note off value found..."
If Panico{}=True Then Statement Return
Case #_ProgramChange
TipoDiEventoMusicale$="Program"
If NuovoByteDiStato>-1
Evento=NuovoByteDiStato
Else
Evento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
EndIf
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " program change value found..."
If Panico{}=True Then Statement Return
Case #_ControlChange
TipoDiEventoMusicale$="Control"
If NuovoByteDiStato>-1
Evento=NuovoByteDiStato
Else
Evento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
EndIf
ValoreEvento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " control change value found..."
If Panico{}=True Then Statement Return
Case #_PolyphonicKeyPressure
TipoDiEventoMusicale$="PolyAftertouch"
If NuovoByteDiStato>-1
Evento=NuovoByteDiStato
Else
Evento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
EndIf
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " polyphonic key pressure value found..."
If Panico{}=True Then Statement Return
Case #_ChannelKeyPressure
TipoDiEventoMusicale$="MonoAftertouch"
If NuovoByteDiStato>-1
Evento=NuovoByteDiStato
Else
Evento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
EndIf
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " channel key pressure value found..."
If Panico{}=True Then Statement Return
Case #_PitchBend
TipoDiEventoMusicale$="PitchBend"
If NuovoByteDiStato>-1
ValoreEvento=NuovoByteDiStato
Else
ValoreEvento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
EndIf
Evento=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " pitchbend value found..."
If Panico{}=True Then Statement Return
Default
TipoDiEventoMusicale$=""
End Select
If TipoDiEventoMusicale$<>""
If TipoDiEventoMusicale$<>"NoteOff"
EventoMusicale()\Tipo=TipoDiEventoMusicale$
EventoMusicale()\Evento=Evento
EventoMusicale()\Inizio=InizioEvento
EventoMusicale()\Canale=CanaleEvento
EventoMusicale()\Sequenza=Sequenza
EventoMusicale()\Durata=2
If TipoDiEventoMusicale$="Note"
EventoMusicale()\Valore=ValoreEvento
EventoMusicale()\Stato | #EventoMusicaleEseguito
EndIf
If TipoDiEventoMusicale$="Control" Then EventoMusicale()\Valore=ValoreEvento
If TipoDiEventoMusicale$="PitchBend" Then EventoMusicale()\Valore=ValoreEvento
Sequenza()\EventiMusicali+1
Else
PushItem EventoMusicale()
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Stato & #EventoMusicaleTerminato<>#EventoMusicaleTerminato
If EventoMusicale()\Stato & #EventoMusicaleEseguito=#EventoMusicaleEseguito
If EventoMusicale()\Tipo="Note" AND EventoMusicale()\Evento=Evento
EventoMusicale()\Durata=(PosizioneEvento/TicPerSessantaquattresimo)*#TicDiBasePerSessantaquattresimo
EventoMusicale()\Durata-EventoMusicale()\Inizio+1
EventoMusicale()\Stato & %11110111
EventoMusicale()\Stato | #EventoMusicaleTerminato
Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileCaricamento
EndIf
EndIf
Else
EventoMusicale()\Stato & %11101111
EndIf
Wend
FineCicloWhileCaricamento
PopItem EventoMusicale()
EndIf
Sequenza()\Durata=Max(Sequenza()\Durata,EventoMusicale()\Inizio+EventoMusicale()\Durata)
EndIf
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
Statement Return
EndIf
Else
TipoDiMetaEvento.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
ContatoreByteTraccia+1
Select TipoDiMetaEvento
Case #SequenceNumber
;---------------------------------------------------------------------------
;questa variabile e' fittizia, il suo valore e' noto ed e' 2, e' usata per
; saltare un dato
;this is a dummy var, its value is known and is 2, is used to skip a datum
;--------------------------------------------------------------------------
LunghezzaMetaEvento.l=Asc(Inkey$)
ContatoreByteTraccia+1
Sequenza=Asc(Inkey$)*256+Asc(Inkey$)+1
ContatoreByteTraccia+2
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " sequence number: ",Sequenza
If Panico{}=True Then Statement Return
Case #SequenceName
LunghezzaNome.l=0
Repeat
DeltaLunghezzaNome.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
FineDeiDeltaLunghezzaNome.b=DeltaLunghezzaNome BitTst 7
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
If FineDeiDeltaLunghezzaNome=True
Print " another sequence name length value to add search..."
Else
Print " this was the last sequence name length value to add..."
EndIf
If Panico{}=True Then Statement Return
DeltaLunghezzaNome BitClr 7
LunghezzaNome+DeltaLunghezzaNome
ContatoreByteTraccia+1
Until FineDeiDeltaLunghezzaNome=False
NomeSequenza$=StripTrail$(Inkey$(LunghezzaNome),0)
ContatoreByteTraccia+LunghezzaNome
Sequenza()\Nome=NomeSequenza$
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
Print " sequence name: ",Left$(NomeSequenza$,80-WCursX/8)
If Panico{}=True Then Statement Return
Default
LunghezzaMetaEvento=0
Repeat
DeltaLunghezzaMetaEvento.b=ConvertiOltreCentoventisetteInNegativo{Asc(Inkey$)}
FineDeiDeltaLunghezzaMetaEvento.b=DeltaLunghezzaMetaEvento BitTst 7
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": byte ",ContatoreByteTraccia," of ",LunghezzaTraccia,","
If FineDeiDeltaLunghezzaMetaEvento=True
Print " another meta event length value to add search..."
Else
Print " this was the last meta event length value to add..."
EndIf
If Panico{}=True Then Statement Return
DeltaLunghezzaMetaEvento BitClr 7
LunghezzaMetaEvento+DeltaLunghezzaMetaEvento
ContatoreByteTraccia+1
Until FineDeiDeltaLunghezzaMetaEvento=False
If LunghezzaMetaEvento>0
ValoreMetaEvento$=Inkey$(LunghezzaMetaEvento)
ContatoreByteTraccia+LunghezzaMetaEvento
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print Left$(ValoreMetaEvento$,80)
EndIf
If Panico{}=True Then Statement Return
End Select
EndIf
Until NuovoByteDiStato=#MetaEvent AND TipoDiMetaEvento=#EndOfTrackChunk
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": ",ContatoreByteTraccia," of ",LunghezzaTraccia,"..."
If Panico{}=True Then Statement Return
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3,0:Print "Track ",Traccia+1,": "
If ContatoreByteTraccia=LunghezzaTraccia
Print "bytes match! :-)"
Else
Print "bytes don't match! :-("
EndIf
Delay_ 50
Else
WLocate 0,0:WColour 3,0:Print "No datum found..."
End If
Else
IlFileCaricatoNonEUnFileMIDI=True
Pop If:Pop If:Pop For:Pop If:Pop If:Pop If:Pop If:Pop If:Pop If:Goto FineCicloCaricamento
EndIf
Else
EZRequest "AmySequencer message","You have used all the available sequences","OK"
Pop If:Pop For:Pop If:Pop If:Pop If:Pop For:Pop If:Pop If:Goto FineCicloCaricamento
EndIf
Next Traccia
EndIf
EndIf
EndIf
Else
IlFileCaricatoNonEUnFileMIDI=True
Pop If:Pop If:Pop If:Goto FineCicloCaricamento
EndIf
Else
IlFileCaricatoNonEUnFileMIDI=True
Pop If:Pop If:Goto FineCicloCaricamento
EndIf
WJam #UnColoreConSfondoTrasparente
FineCicloCaricamento
CloseFile 0
PopInput
If IlFileCaricatoNonEUnFileMIDI=True
EZRequest "AmySequencer message","This is not a MIDI file","OK"
Else
If CaricatoDalMenu=False
For FileMIDIAperto.b=3 To 0 Step -1
FileMIDIAperto$(FileMIDIAperto+1)=FileMIDIAperto$(FileMIDIAperto)
Next FileMIDIAperto
FileMIDIAperto$(0)=NomeDelFileMIDI$
StoriaDeiFileMIDIAperti=WriteFile(0,"LoadedMIDIFilesHistory")
If StoriaDeiFileMIDIAperti=True
FileOutput 0
For FileMIDIAperto=0 To 4
If FileMIDIAperto$(FileMIDIAperto)<>""
NPrint FileMIDIAperto$(FileMIDIAperto)
EndIf
Next FileMIDIAperto
CloseFile 0
PopOutput
VoceMenuEsci+1
EndIf
EndIf
EndIf
EndIf
EndIf
End Statement
;-----------------------------------------------------------
;questa procedura imposta i suoni da usare con il programma
;this procedure sets sounds to use with the program
;---------------------------------------------------
Statement EditoreSuoni{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED CanaliAttivati
SHARED LarghezzaSchermo
SHARED PercorsoSuoni$
SHARED Suono()
SHARED XLunSlider
SHARED YLunSlider
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
MenuTitle #ListaMenuEditoreSuoni,0,"Sounds"
MenuItem #ListaMenuEditoreSuoni,0,0,0,"Load"
MenuItem #ListaMenuEditoreSuoni,0,0,1,"Discard"
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1
LarghezzaInternaFinestraEditoreSuoni.w=InnerWidth
AltezzaInternaFinestraEditoreSuoni.w=InnerHeight
CloseWindow #FinestraEditoreSuoni
;-------------------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare i suoni disponibili
;sets the slider that is used to show the available sounds
;----------------------------------------------------------
XLunSlider=16
YLunSlider=AltezzaInternaFinestraEditoreSuoni
ImpostaSlider{#SliderEditoreSuoni,LarghezzaInternaFinestraEditoreSuoni-16,0,"VERTICAL",0,#ListaGadgetEditoreSuoni}
Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1,#ListaGadgetEditoreSuoni
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuEditoreSuoni
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #DueColoriConSfondoPieno
;-----------------------------------
;sounds window's displacement start
;-----------------------------------
InizioSuoni.b=0
;------------------------
;maximum strings length
;------------------------
LunghezzaMassimaStringhe.b=(LarghezzaInternaFinestraEditoreSuoni-16)/8
;---------------------------------
;stated by mouse new sound number
;---------------------------------
NuovoSuonoIndicatoDalTopo.b=-1
;-----------------------------
;stated by mouse sound number
;-----------------------------
SuonoIndicatoDalTopo.b=-1
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
MostraSlider{#SliderEditoreSuoni,InizioSuoni,2,"VERTICAL",#ListaGadgetEditoreSuoni,#FinestraEditoreSuoni}
Repeat
If SecondoClicDelTopo.b=False
WCls
WLocate 0,0
;----------------------
;loaded sounds counter
;----------------------
SuoniCaricati=0
For Suono.b=0 To 30
AssegnamentoSuono$=Suono(InizioSuoni+Suono)\Nome
If AssegnamentoSuono$<>""
CanaleSuono.b=Suono(InizioSuoni+Suono)\Canale
If CanaleSuono>0
WColour CanaleSuono-1,16-CanaleSuono:Format "00":CanaleSuono$=" channel "+Str$(CanaleSuono):Format""
Else
WColour 1,0:CanaleSuono$=" no channel"
EndIf
AssegnamentoSuono$+CanaleSuono$
AssegnamentoSuono$=Right$(AssegnamentoSuono$,LunghezzaMassimaStringhe)
AssegnamentoSuono$+SPACE$(LunghezzaMassimaStringhe-Len(AssegnamentoSuono$))
NPrint AssegnamentoSuono$
If SuonoIndicatoDalTopo>-1 AND SuonoIndicatoDalTopo=InizioSuoni+Suono
If CanaleSuono>0
Wline 0,SuonoIndicatoDalTopo*8,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8+7,CanaleSuono-1
Wline 0,SuonoIndicatoDalTopo*8+7,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8,CanaleSuono-1
Else
Wline 0,SuonoIndicatoDalTopo*8,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8+7,1
Wline 0,SuonoIndicatoDalTopo*8+7,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8,1
EndIf
EndIf
SuoniCaricati+1
EndIf
Next Suono
SecondoClicDelTopo=True
EndIf
If SuoniCaricati=32
Enable #ListaGadgetEditoreSuoni,#SliderEditoreSuoni
Else
Disable #ListaGadgetEditoreSuoni,#SliderEditoreSuoni
EndIf
Redraw #FinestraEditoreSuoni
EventoFinestraEditoreSuoni.l=WaitEvent
Select EventoFinestraEditoreSuoni
Case #HaiPremutoUnTastoDelTopo
TastoDelTopoCliccato.b=MButtons:YTopo=WMouseY
Select TastoDelTopoCliccato
Case #TastoSinistroPremutoDelTopo
NuovoSuonoIndicatoDalTopo=YTopo/8+InizioSuoni
If NuovoSuonoIndicatoDalTopo=SuonoIndicatoDalTopo
If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati
CanaleSuonoIndicatoDalTopo.b=Suono(SuonoIndicatoDalTopo)\Canale
If CanaliAttivati=%1111111111111111
Suono(SuonoIndicatoDalTopo)\Canale=0
CanaliAttivati BitClr (CanaleSuonoIndicatoDalTopo-1)
Else
If CanaleSuonoIndicatoDalTopo>0
If CanaleSuonoIndicatoDalTopo=16
Suono(SuonoIndicatoDalTopo)\Canale=0
CanaliAttivati BitClr 15
CanaleSuono=0
Else
For CanaleSuono=1 To 15
CanaleLibero.b=CanaleSuono+CanaleSuonoIndicatoDalTopo
While CanaleLibero>16
CanaleLibero-16
Wend
If CanaliAttivati BitTst (CanaleLibero-1)=False
Suono(SuonoIndicatoDalTopo)\Canale=CanaleLibero
CanaliAttivati BitClr (CanaleSuonoIndicatoDalTopo-1)
CanaliAttivati BitSet (CanaleLibero-1)
Pop If:Pop For:Pop If:Pop If:Pop If:Goto FineCicloAssegnamentoCanali
EndIf
Next CanaleSuono
EndIf
Else
For CanaleSuono=0 To 15
If CanaliAttivati BitTst CanaleSuono=False
Suono(SuonoIndicatoDalTopo)\Canale=CanaleSuono+1
CanaliAttivati BitSet CanaleSuono
Pop If:Pop For:Pop If:Pop If:Goto FineCicloAssegnamentoCanali
EndIf
Next CanaleSuono
EndIf
EndIf
FineCicloAssegnamentoCanali
If CanaleSuono=16 Then EZRequest "AmySequencer Message","No free channel available","OK"
EndIf
Else
SuonoIndicatoDalTopo=NuovoSuonoIndicatoDalTopo
EndIf
SecondoClicDelTopo=False
Case #TastoSinistroDelTopoRilasciato
SecondoClicDelTopo=True
End Select
; Case #HaiPremutoUnGadget
; InizioSuoni=ValoreSlider{#SliderEditoreSuoni,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
; SecondoClicDelTopo=False
Case #HaiRilasciatoUnGadget
InizioSuoni=ValoreSlider{#SliderEditoreSuoni,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
SecondoClicDelTopo=False
Case #HaiAttivatoIlMenu
If MenuHit=0 AND ItemHit=0
If SuoniCaricati<32
MaxLen PercorsoSuoni$=160
MaxLen NomeSuono$=64
NomeSuono$=FileRequest$("Load a sound...",PercorsoSuoni$,NomeSuono$)
If NomeSuono$<>""
StessoSuono.b=False
If SuoniCaricati>0
For SuonoPrecedente=0 To SuoniCaricati-1
If NomeSuono$=Suono(SuonoPrecedente)\Nome Then StessoSuono=True
Next SuonoPrecedente
EndIf
If StessoSuono=False
Suono=SuoniCaricati
LoadSound Suono,NomeSuono$
Suono(Suono)\Nome=NomeSuono$
Sound Suono,3
EndIf
EndIf
Else
EZRequest "AmySequencer message","You cannot load more sounds","OK"
EndIf
EndIf
If MenuHit=0 AND ItemHit=1
If SuoniCaricati>0
If SuonoIndicatoDalTopo<SuoniCaricati AND SuonoIndicatoDalTopo>-1
Suono=SuonoIndicatoDalTopo
Free Sound Suono
Suono(Suono)\Nome=""
While Suono+1<SuoniCaricati
Suono(Suono)\Nome=Suono(Suono+1)\Nome
Suono(Suono)\Canale=Suono(Suono+1)\Canale
Suono+1
Wend
Suono(Suono)\Nome=""
CanaliAttivati BitClr (Suono(Suono)\Canale-1)
Suono(Suono)\Canale=0
SuonoIndicatoDalTopo=-1
Else
EZRequest "AmySequencer message","You must select a sound first","OK"
EndIf
Else
EZRequest "AmySequencer message","You must load a sound first","OK"
EndIf
EndIf
SecondoClicDelTopo=False
Case #HaiChiusoLaFinestra
; SuoniAssegnatiAlloStessoCanale.b=False
; For SuonoUno.b=0 To 31
; For SuonoDue.b=0 To 31
; If SuonoUno<>SuonoDue
; If Suono(SuonoUno)\Canale>0 AND Suono(SuonoUno)\Canale=Suono(SuonoDue)\Canale
; SuoniAssegnatiAlloStessoCanale=True
; EndIf
; EndIf
; Next SuonoDue
; Next SuonoUno
; If SuoniAssegnatiAlloStessoCanale=True
; Messaggio$="You have two or more sounds|assigned to the same channel;|please adjust all better!"
; EZRequest "AmySequencer message",Messaggio$,"OK"
; SecondoClicDelTopo=False
; Else
EsciDallEditoreSuoni.b=True
; EndIf
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$)
Select TastoPremuto$
Case TastoEsc$
EsciDallEditoreSuoni=True
Case TastoCursoreSu$
Case TastoCursoreGiu$
End Select
SecondoClicDelTopo=False
End Select
Until EsciDallEditoreSuoni=True
CloseWindow #FinestraEditoreSuoni
Use Window #FinestraPrincipale
WJam #UnColoreConSfondoTrasparente
End Statement
;-----------------------------------------------------
;questa procedura cancella a video un evento musicale
;this procedure clears on screen a musical event
;------------------------------------------------
Statement CancellaUnEventoMusicale{TipoDiEventoMusicale$,Evento.w,InizioEvento.l,DurataEvento.l,StatoEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
SelezioneEventoMusicale.b=StatoEvento & #EventoMusicaleSelezionato
EventoMusicaleTagliato.b=StatoEvento & #EventoMusicaleTagliato
EventoMusicaleCopiato.b=StatoEvento & #EventoMusicaleCopiato
Select TipoDiEventoMusicale$
Case "Note"
NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
InizioNota.l=InizioEvento:FineNota.l=InizioNota+DurataEvento-1
I.w=16+(InizioNota-XInizioAreaVisibile)/ScalaEventiMusicali
F.w=16+(FineNota-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
InizioNotaVisibile.b=True
Else
InizioNotaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
FineNotaVisibile.b=True
Else
FineNotaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
NotaVisibile.b=True
Else
If InizioNotaVisibile=True OR FineNotaVisibile=True
NotaVisibile=True
Else
NotaVisibile=False
EndIf
EndIf
If NotaVisibile=True
X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
If TipoDiNota(Nota)\Diesis=True
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,0
Else
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,3
EndIf
EndIf
EndIf
Case "Program"
FineProgramma.l=InizioEvento+Len("Program000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineProgramma+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineProgramma+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineProgramma+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+(FineProgramma-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Programma.b=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
For Linea.b=0 To 7
Y.w=Programma+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineProgramma,Y,0
Else
Wline I,Y,FineProgramma,Y,3
EndIf
Next Linea
EndIf
Case "Control"
FineControllo.l=InizioEvento+Len("Control000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineControllo+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineControllo+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineControllo+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+(FineControllo-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Controllo.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
For Linea.b=0 To 7
Y=Controllo+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineControllo,Y,0
Else
Wline I,Y,FineControllo,Y,3
EndIf
Next Linea
EndIf
Case "PolyAftertouch"
FinePressioneMultipla.l=InizioEvento+Len("Poly000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneMultipla+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneMultipla+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneMultipla+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+(FinePressioneMultipla-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
PressioneMultipla.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
For Linea.b=0 To 7
Y=PressioneMultipla+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FinePressioneMultipla,Y,0
Else
Wline I,Y,FinePressioneMultipla,Y,3
EndIf
Next Linea
EndIf
Case "MonoAftertouch"
FinePressioneSingola.l=InizioEvento+Len("Mono000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneSingola+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneSingola+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneSingola+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+(FinePressioneSingola-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
PressioneSingola.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
For Linea.b=0 To 7
Y=PressioneSingola+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FinePressioneSingola,Y,0
Else
Wline I,Y,FinePressioneSingola,Y,3
EndIf
Next Linea
EndIf
Case "PitchBend"
FineCurvaDiPicco.l=InizioEvento+Len("Bend+0000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineCurvaDiPicco+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineCurvaDiPicco+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineCurvaDiPicco+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+(FineCurvaDiPicco-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
CurvaDiPicco.w=AreaVisibileDeiValori*Max((127-Evento/128+1),0)/127
For Linea.b=0 To 7
Y=CurvaDiPicco+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineCurvaDiPicco,Y,0
Else
Wline I,Y,FineCurvaDiPicco,Y,3
EndIf
Next Linea
EndIf
Case "Tempo"
FineTempo.l=InizioEvento+Len("Tempo00/00")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineTempo+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineTempo+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineTempo+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+(FineTempo-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
Tempo.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
For Linea.b=0 To 7
Y=Tempo+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineTempo,Y,0
Else
Wline I,Y,FineTempo,Y,3
EndIf
Next Linea
EndIf
Case "BPM"
FineBattutePerMinuto.l=InizioEvento+Len("BPM000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineBattutePerMinuto+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineBattutePerMinuto+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineBattutePerMinuto+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+(FineBattutePerMinuto-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
BattutePerMinuto.w=AreaVisibileDeiValori*Max(97-Evento/3+1,0)/97
For Linea.b=0 To 7
Y=BattutePerMinuto+Linea
If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
Wline I,Y,FineBattutePerMinuto,Y,0
Else
Wline I,Y,FineBattutePerMinuto,Y,3
EndIf
Next Linea
EndIf
End Select
End Statement
;--------------------------------------------
;questa procedura disegna un evento musicale
;this procedure draws a musical events
;--------------------------------------
Statement DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento.w,InizioEvento.l,DurataEvento.l,CanaleEvento.b,StatoEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
SelezioneEventoMusicale.b=StatoEvento & #EventoMusicaleSelezionato
EventoMusicaleTagliato.b=StatoEvento & #EventoMusicaleTagliato
EventoMusicaleCopiato.b=StatoEvento & #EventoMusicaleCopiato
EventoMusicaleEseguito.b=StatoEvento & #EventoMusicaleEseguito
Select TipoDiEventoMusicale$
Case "Note"
NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
FineNota.l=InizioEvento+DurataEvento-1
I.w=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F.w=16+(FineNota-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
InizioNotaVisibile.b=True
Else
InizioNotaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
FineNotaVisibile.b=True
Else
FineNotaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
NotaVisibile.b=True
Else
If InizioNotaVisibile=True OR FineNotaVisibile=True
NotaVisibile=True
Else
NotaVisibile=False
EndIf
EndIf
If NotaVisibile=True
X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
WBox X0Nota,Y0Nota,X1Nota,Y1Nota,16-CanaleEvento
If EventoMusicaleEseguito=0
If EventoMusicaleTagliato=#EventoMusicaleTagliato
WLocate X0Nota,Y0Nota:WColour CanaleEvento-1,16-CanaleEvento:Print Left$("Cutted",(X1Nota-X0Nota+1)/8)
EndIf
If EventoMusicaleCopiato=#EventoMusicaleCopiato
WLocate X0Nota,Y0Nota:WColour CanaleEvento-1,16-CanaleEvento:Print Left$("Copied",(X1Nota-X0Nota+1)/8)
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
Wline X0Nota,NotaVisualizzata,X1Nota,NotaVisualizzata+7,CanaleEvento-1
Wline X0Nota,NotaVisualizzata+7,X1Nota,NotaVisualizzata,CanaleEvento-1
EndIf
If SelezioneEventoMusicale=#EventoMusicaleNonSelezionato
Wline X0Nota+1,NotaVisualizzata+1,X1Nota-1,NotaVisualizzata+1,CanaleEvento-1
Wline X0Nota+1,NotaVisualizzata+6,X1Nota-1,NotaVisualizzata+6,CanaleEvento-1
EndIf
If SelezioneEventoMusicale=#EventoMusicaleNonSelezionato
If InizioNotaVisibile=True
Wline I+1,NotaVisualizzata+1,I+1,NotaVisualizzata+6,CanaleEvento-1
EndIf
If FineNotaVisibile=True
Wline F-1,NotaVisualizzata+1,F-1,NotaVisualizzata+6,CanaleEvento-1
EndIf
EndIf
EndIf
EndIf
EndIf
Case "Program"
FineProgramma.l=InizioEvento+Len("Program000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineProgramma+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineProgramma+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineProgramma+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+FineProgramma-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
If EventoMusicaleEseguito=#EventoMusicaleEseguito
WColour 3,16-CanaleEvento
Else
WColour CanaleEvento-1,16-CanaleEvento
EndIf
Format "000":Programma$="Program"+Str$(Evento):Format ""
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Programma$+"X"
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Programma$+"Cu"
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print Programma$+"Co"
If I<0 Then IniziaPrima.b=True
If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo.b=True
I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
Y.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
If IniziaPrima=True Then Programma$=Right$(Programma$,(F-I+1)/8)
If FinisceDopo=True Then Programma$=Left$(Programma$,(F-I+1)/8)
WLocate 16+I,Y:Print Programma$
EndIf
Case "Control"
FineControllo.l=InizioEvento+Len("Control000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineControllo+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineControllo+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineControllo+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+FineControllo-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
If EventoMusicaleEseguito=#EventoMusicaleEseguito
WColour 3,16-CanaleEvento
Else
WColour CanaleEvento-1,16-CanaleEvento
EndIf
Format "000":Controllo$="Control"+Str$(Evento):Format ""
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Controllo$+"X"
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Controllo$+"Cu"
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print Controllo$+"Co"
If I<0 Then IniziaPrima=True
If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
If IniziaPrima=True Then Controllo$=Right$(Controllo$,(F-I+1)/8)
If FinisceDopo=True Then Controllo$=Left$(Controllo$,(F-I+1)/8)
WLocate 16+I,Y:Print Controllo$
EndIf
Case "PolyAftertouch"
FinePressioneMultipla.l=InizioEvento+Len("Poly000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneMultipla+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneMultipla+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneMultipla+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+FinePressioneMultipla-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
If EventoMusicaleEseguito=#EventoMusicaleEseguito
WColour 3,16-CanaleEvento
Else
WColour CanaleEvento-1,16-CanaleEvento
EndIf
Format "000":PressioneMultipla$="Poly"+Str$(Evento):Format ""
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then PressioneMultipla$+"X"
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then PressioneMultipla$+"Cu"
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print PressioneMultipla$+"Co"
If I<0 Then IniziaPrima=True
If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
If IniziaPrima=True Then PressioneMultipla$=Right$(PressioneMultipla$,(F-I+1)/8)
If FinisceDopo=True Then PressioneMultipla$=Left$(PressioneMultipla$,(F-I+1)/8)
WLocate 16+I,Y:Print PressioneMultipla$
EndIf
Case "MonoAftertouch"
FinePressioneSingola.l=InizioEvento+Len("Mono000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneSingola+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneSingola+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneSingola+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+FinePressioneSingola-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
If EventoMusicaleEseguito=#EventoMusicaleEseguito
WColour 3,16-CanaleEvento
Else
WColour CanaleEvento-1,16-CanaleEvento
EndIf
Format "000":PressioneSingola$="Mono"+Str$(Evento):Format ""
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then PressioneSingola$+"X"
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then PressioneSingola$+"Cu"
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print PressioneSingola$+"Co"
If I<0 Then IniziaPrima=True
If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
If IniziaPrima=True Then PressioneSingola$=Right$(PressioneSingola$,(F-I+1)/8)
If FinisceDopo=True Then PressioneSingola$=Left$(PressioneSingola$,(F-I+1)/8)
WLocate 16+I,Y:Print PressioneSingola$
EndIf
Case "PitchBend"
FineCurvaDiPicco.l=InizioEvento+Len("Bend+0000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineCurvaDiPicco+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineCurvaDiPicco+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineCurvaDiPicco+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+FineCurvaDiPicco-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
If EventoMusicaleEseguito=#EventoMusicaleEseguito
WColour 3,16-CanaleEvento
Else
WColour CanaleEvento-1,16-CanaleEvento
EndIf
Format "+0000":CurvaDiPicco$="Bend"+Str$(Evento-#_PitchBendCenter):Format ""
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then CurvaDiPicco$+"X"
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then CurvaDiPicco$+"Cu"
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then CurvaDiPicco$+"Co"
If I<0 Then IniziaPrima=True
If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
Y=AreaVisibileDeiValori*Max(127-Evento/128+1,0)/127
If IniziaPrima=True Then CurvaDiPicco$=Right$(CurvaDiPicco$,(F-I+1)/8)
If FinisceDopo=True Then CurvaDiPicco$=Left$(CurvaDiPicco$,(F-I+1)/8)
WLocate 16+I,Y:Print CurvaDiPicco$
EndIf
Case "Tempo"
FineTempo.l=InizioEvento+Len("Tempo00/00")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineTempo+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineTempo+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineTempo+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+FineTempo-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
If EventoMusicaleEseguito=#EventoMusicaleEseguito
WColour 3,16-CanaleEvento
Else
WColour CanaleEvento-1,16-CanaleEvento
EndIf
Format "00":Tempo$="Tempo"+Str$(Evento MOD 16+1)+"/"+Str$(Evento/16+1):Format ""
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Tempo$+"X"
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Tempo$+"Cu"
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Tempo$+"Co"
If I<0 Then IniziaPrima=True
If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
If IniziaPrima=True Then Tempo$=Right$(Tempo$,(F-I+1)/8)
If FinisceDopo=True Then Tempo$=Left$(Tempo$,(F-I+1)/8)
WLocate 16+I,Y:Print Tempo$
EndIf
Case "BPM"
FineBattutePerMinuto.l=InizioEvento+Len("BPM000")*8-1
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineBattutePerMinuto+Len("X")*8
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineBattutePerMinuto+Len("Cu")*8
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineBattutePerMinuto+Len("Co")*8
I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
F=16+FineBattutePerMinuto-XInizioAreaVisibile
If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
If EventoMusicaleEseguito=#EventoMusicaleEseguito
WColour 3,16-CanaleEvento
Else
WColour CanaleEvento-1,16-CanaleEvento
EndIf
Format "000":BattutePerMinuto$="BPM"+Str$(9+Evento):Format ""
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then BattutePerMinuto$+"X"
If EventoMusicaleTagliato=#EventoMusicaleTagliato Then BattutePerMinuto$+"Cu"
If EventoMusicaleCopiato=#EventoMusicaleCopiato Then BattutePerMinuto$+"Co"
If I<0 Then IniziaPrima=True
If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
Y=AreaVisibileDeiValori*Max(97-Evento/3+1,0)/97
If IniziaPrima=True Then BattutePerMinuto$=Right$(BattutePerMinuto$,(F-I+1)/8)
If FinisceDopo=True Then BattutePerMinuto$=Left$(BattutePerMinuto$,(F-I+1)/8)
WLocate 16+I,Y:Print BattutePerMinuto$
EndIf
End Select
End Statement
;---------------------------------------------------------------
;questa procedura mostra la scala di visualizzazione delle note
;this procedure shows the note scale of notes displaying
;--------------------------------------------------------
Statement MostraLaScalaDegliEventiMusicali{Ritardo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED ColoriOriginali
SHARED ScalaEventiMusicali
; For Scatola.b=0 To 4
; Y0Scatola.w=AltezzaInternaFinestraEditoreSequenza-8-8
; WBox Scatola,Y0Scatola+Scatola,15-Scatola,Y0Scatola+7-Scatola,15-Scatola
; Next Scatola
Select ScalaEventiMusicali
Case 1
Ingrandimento.b=1
Case 2
Ingrandimento=2
Case 4
Ingrandimento=3
Case 8
Ingrandimento=4
Case 16
Ingrandimento=5
Case 32
Ingrandimento=6
Case 64
Ingrandimento=7
End Select
WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
If ColoriOriginali=True Then WColour 1,0 Else WColour 2,1
Print "Z",Ingrandimento
If Ritardo=True Then Delay_ 50
WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
Print "+-"
End Statement
Statement MostraITastiDaUsare{}
MostraITastiDaUsare$="Esc>.........leave the editor|"
MostraITastiDaUsare$+"Space>.......insert a rest|"
MostraITastiDaUsare$+"|"
MostraITastiDaUsare$+"No selected events:|"
MostraITastiDaUsare$+"Cursor up>...scroll window up|"
MostraITastiDaUsare$+"Cursor down>.scroll window down|"
MostraITastiDaUsare$+"Cursor left>.scroll window backward|"
MostraITastiDaUsare$+"Cursor right>scroll window forward|"
MostraITastiDaUsare$+"Backspace>...delete last event|"
MostraITastiDaUsare$+"|"
MostraITastiDaUsare$+"No selected plus shift:|"
MostraITastiDaUsare$+"Cursor left>.move insertion point backward|"
MostraITastiDaUsare$+"Cursor right>move insertion point forward|"
MostraITastiDaUsare$+"Backspace>...delete last event"
EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"
MostraITastiDaUsare$="With selected events:|"
MostraITastiDaUsare$+"Cursor up>...inc sel events/tempo beat|"
MostraITastiDaUsare$+"Cursor down>.dec sel events/tempo beat|"
MostraITastiDaUsare$+"Cursor left>.move sel events forward|"
MostraITastiDaUsare$+"Cursor right>move sel events backward|"
MostraITastiDaUsare$+"Backspace>...delete last event|"
MostraITastiDaUsare$+"|"
MostraITastiDaUsare$+"With selected events plus shift:|"
MostraITastiDaUsare$+"Cursor up>...move sel notes up of one octave|"
MostraITastiDaUsare$+" inc sel events of 10|"
MostraITastiDaUsare$+" inc sel tempo events measure|"
MostraITastiDaUsare$+"Cursor down>.move sel notes down of one octave|"
MostraITastiDaUsare$+" dec sel events of 10|"
MostraITastiDaUsare$+" dec sel tempo events measure|"
MostraITastiDaUsare$+"Cursor left>.stretch sel notes backward|"
MostraITastiDaUsare$+"Cursor right>stretch sel notes forward|"
MostraITastiDaUsare$+"Backspace>...delete all sel events"
EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"
End Statement
Statement MostraLaMappaturaDelleNoteSullaTastiera{}
MostraLaMappaturaDelleNoteSullaTastiera$="Note lo octave hi octave|"
MostraLaMappaturaDelleNoteSullaTastiera$+"C--Do >........Z.........Q|"
MostraLaMappaturaDelleNoteSullaTastiera$+"C#-Do# >........S.........2|"
MostraLaMappaturaDelleNoteSullaTastiera$+"D--Re >........X.........W|"
MostraLaMappaturaDelleNoteSullaTastiera$+"D#-Re# >........D.........3|"
MostraLaMappaturaDelleNoteSullaTastiera$+"E--Mi >........C.........E|"
MostraLaMappaturaDelleNoteSullaTastiera$+"F--Fa >........V.........R|"
MostraLaMappaturaDelleNoteSullaTastiera$+"F#-Fa# >........G.........5|"
MostraLaMappaturaDelleNoteSullaTastiera$+"G--Sol >........B.........T|"
MostraLaMappaturaDelleNoteSullaTastiera$+"G#-Sol#>........H.........6|"
MostraLaMappaturaDelleNoteSullaTastiera$+"A--La >........N.........Y|"
MostraLaMappaturaDelleNoteSullaTastiera$+"A#-La# >........J.........7|"
MostraLaMappaturaDelleNoteSullaTastiera$+"B--Si >........M.........U|"
MostraLaMappaturaDelleNoteSullaTastiera$+"|"
MostraLaMappaturaDelleNoteSullaTastiera$+"function keys to select octave"
EZRequest "AmySequencer help",MostraLaMappaturaDelleNoteSullaTastiera$,"OK"
End Statement
Statement ProgressioneEventiMusicaliCurvaDiPicco{InizioProgressione.w,FineProgressione.w}
SHARED CanaleSelezionato
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
If CanaleSelezionato>0
Valori.b=EZRequest("AmySequencer message","How many inner values|for the progression?","1|2|4|8|16|32|64|Cancel")
If Valori=0 Then Statement Return
Valori=2+2^(Valori-1)
Passo.w=(FineProgressione-InizioProgressione)/(Valori-1)
LastItem EventoMusicale()
For Valore.w=InizioProgressione To FineProgressione Step Passo
If AddItem(EventoMusicale())=True
EventoMusicale()\Tipo="PitchBend"
EventoMusicale()\Evento=Valore/128
EventoMusicale()\Valore=Valore MOD 128
EventoMusicale()\Inizio=XInizioAreaVisibile+LarghezzaEventoBase/(Valori-1)*Abs(Valore-InizioProgressione)/Passo
EventoMusicale()\Durata=2
EventoMusicale()\Canale=CanaleSelezionato
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Stato=#EventoMusicaleNonSelezionato
EventiMusicali+1
EventiMusicaliSelezionati+1
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
ProgressioneInterrotta.b=True
Pop For:Goto FineCicloForProgressione
EndIf
Next Valore
FineCicloForProgressione
If ProgressioneInterrotta=False Then EZRequest "AmySequencer message","Progression successfully completed!","OK"
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
End Statement
;---------------------------------------------------
;questa procedura permette di cambiare la nota base
;this procedure permits to change the basic note
;------------------------------------------------
Statement CambiaLEventoBase{}
SHARED AltezzaFonte
SHARED ColoriOriginali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED ParlatoAttivato
SHARED TastoCursoreDestra$
SHARED TastoCursoreSinistra$
SHARED TastoEsc$
SHARED TipoDiEventoMusicaleDiBase$
SHARED ValoreEventoBase
SHARED XLunSlider
SHARED YLunSlider
TipoFinestra.l=#FinestraMovibile+#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
YPosF.w=(AltezzaFonte+3)*2
YLunF.w=AltezzaFonte+3+16+8+8+2
If TipoDiEventoMusicaleDiBase$<>"Program"
If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
YLunF+8+8
EndIf
EndIf
EndIf
If TipoDiEventoMusicaleDiBase$="PitchBend" Then YLunF+8+8
TitoloFinestra$="Basic event: "+LCase$(TipoDiEventoMusicaleDiBase$)
Window #FinestraCambioEventoBase,4,YPosF,4+24*10+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
LarghezzaInternaFinestraCambioEventoBase.w=InnerWidth
AltezzaInternaFinestraCambioEventoBase.w=InnerHeight
CloseWindow #FinestraCambioEventoBase
XLunSlider=LarghezzaInternaFinestraCambioEventoBase
YLunSlider=8
If TipoDiEventoMusicaleDiBase$<>"Program"
If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
If TipoDiEventoMusicaleDiBase$="PitchBend"
ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
ImpostaSlider{3,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
Else
ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
EndIf
Else
ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
EndIf
EndIf
Else
ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
EndIf
Window #FinestraCambioEventoBase,4,YPosF,4+24*10+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetCambioEventoBase
WindowFont #FonteDiCaratteriTopaz8
; Zona.b=NewZoneTable(#TabellaZoneCambioEventoBase,9)
; If Zona=True Then UseZoneTable #TabellaZoneCambioEventoBase Else Statement Return
; UseZoneTable #TabellaZoneEditoreSequenza
For Zona.b=0 To 7
WBlit Zona,24*Zona,0;:SetZone Zona,24*Zona,0,24*Zona+23,15
Next
WLocate 24*8+8,4:WColour 1,0:Print "3";:SetZone 8,24*8,0,24*8+23,15
WLocate 24*9+8,4:WColour 1,0:Print "5";:SetZone 9,24*9,0,24*9+23,15
MostraSlider{1,(LarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
If TipoDiEventoMusicaleDiBase$<>"Program"
If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
If TipoDiEventoMusicaleDiBase$="PitchBend"
;------------------------------------------------------------------------------
;questa variabile contiene il valore finale di base dello spostamento di picco
; delle note
;this variable retains the basic pitch bend final value
;-------------------------------------------------------
FineCurvaDiPiccoEventoBase.w=#_PitchBendCenter
;--------------------------------------------------------------------------------
;questa variabile contiene il valore iniziale di base dello spostamento di picco
; delle note
;this variable retains the basic pitch bend initial value
;---------------------------------------------------------
InizioCurvaDiPiccoEventoBase.w=#_PitchBendCenter
ValoreMassimo.w=16384
Valore.w=InizioCurvaDiPiccoEventoBase
MostraSlider{2,Valore,ValoreMassimo,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
Valore.w=FineCurvaDiPiccoEventoBase
MostraSlider{3,Valore,ValoreMassimo,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
Else
MostraSlider{2,ValoreEventoBase,127,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
EndIf
EndIf
EndIf
EndIf
NuovaLarghezzaEventoBase.w=LarghezzaEventoBase
NuovoValoreEventoBase.w=ValoreEventoBase
NuovoInizioCurvaDiPiccoEventoBase.w=InizioCurvaDiPiccoEventoBase
NuovaFineCurvaDiPiccoEventoBase.w=FineCurvaDiPiccoEventoBase
EventoBaseModificato.b=False
Repeat
If SecondoClicDelTopo.b=False
If TipoDiEventoMusicaleDiBase$<>"Program"
If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
If TipoDiEventoMusicaleDiBase$="PitchBend"
WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8-8-8
Else
WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8
EndIf
Else
WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
EndIf
EndIf
Else
WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
EndIf
If NuovaLarghezzaEventoBase MOD 6=0
If ColoriOriginali=True Then WColour 3,2 Else WColour 10,9
Else
WColour 2,1
EndIf
Format "0000":Print NuovaLarghezzaEventoBase:Format "":Print SPACE$(21)+"width"
If TipoDiEventoMusicaleDiBase$<>"Program"
If TipoDiEventoMusicaleDiBase$<>"PolyAftertouch" AND TipoDiEventoMusicaleDiBase$<>"MonoAftertouch"
If TipoDiEventoMusicaleDiBase$<>"Tempo" AND TipoDiEventoMusicaleDiBase$<>"BPM"
If TipoDiEventoMusicaleDiBase$="PitchBend"
Y.w=AltezzaInternaFinestraCambioEventoBase-8-8-8-8
WLocate 0,Y:WColour 1,0:Format "+0000"
Print NuovoInizioCurvaDiPiccoEventoBase-#_PitchBendCenter:Format ""
Valore$="initial"
Else
Y=AltezzaInternaFinestraCambioEventoBase-8-8
WLocate 0,Y:WColour 1,0:Format "000":Print NuovoValoreEventoBase:Format ""
If TipoDiEventoMusicaleDiBase$="Note" Then Valore$="velocity"
If TipoDiEventoMusicaleDiBase$="Control" Then Valore$="value"
EndIf
WLocate (30-Len(Valore$))*8,Y:Print Valore$
EndIf
EndIf
EndIf
If TipoDiEventoMusicaleDiBase$="PitchBend"
Y=AltezzaInternaFinestraCambioEventoBase-8-8
WLocate 0,Y:WColour 1,0:Format "+0000"
Print NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter:Format ""
Valore$="final":WLocate (30-Len(Valore$))*8,Y:Print Valore$
EndIf
SecondoClicDelTopo=True
EndIf
Repeat
If ParlatoAttivato=True AND Parlato$<>"" AND Timer-TempoTrascorso.l>49 Then Speak Parlato$:Parlato$=""
EventoFinestraCambioEventoBase.l=Event
Until EventoFinestraCambioEventoBase>0
Select EventoFinestraCambioEventoBase
Case #HaiPremutoUnTastoDelTopo
XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato.b=MButtons
Select TastoDelTopoCliccato
Case #TastoSinistroPremutoDelTopo
XZonaTopo.b=XTopo/24+1:YZonaTopo.b=YTopo>=0 AND YTopo<16
If YZonaTopo=True
Select XZonaTopo
Case 1
NuovaLarghezzaEventoBase=#TicDiBasePerQuarto*4:NotaPuntata.w=0:Terzina.b=0:Cinquina.b=0
Parlato$="You have choosen a whole note width"
Case 2
NuovaLarghezzaEventoBase=#TicDiBasePerQuarto*2:NotaPuntata=0:Terzina=0:Cinquina=0
Parlato$="You have choosen a half note width"
Case 3
NuovaLarghezzaEventoBase=#TicDiBasePerQuarto:NotaPuntata=0:Terzina=0:Cinquina=0
Parlato$="You have choosen a quarter note width"
Case 4
NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/2:NotaPuntata=0:Terzina=0:Cinquina=0
Parlato$="You have choosen an eighth note width"
Case 5
NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/4:NotaPuntata=0:Terzina=0:Cinquina=0
Parlato$="You have choosen a sixteenth note width"
Case 6
NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/8:NotaPuntata=0:Terzina=0:Cinquina=0
Parlato$="You have choosen a thirty second note width"
Case 7
NuovaLarghezzaEventoBase=#TicDiBasePerQuarto/16:NotaPuntata=0:Terzina=0:Cinquina=0
Parlato$="You have choosen a sixty fourth note width"
Case 8
If NotaPuntata=0
NotaPuntata=NuovaLarghezzaEventoBase/2
NuovaLarghezzaEventoBase+NotaPuntata
If Terzina>0
Terzina=0
Parlato$="You have no more a triplet note width, you have choosen a dotted note width"
Else
If Cinquina>0
Cinquina=0
Parlato$="You have no more a quintet note width, you have choosen a dotted note width"
Else
Parlato$="You have choosen a dotted note width"
EndIf
EndIf
Else
NuovaLarghezzaEventoBase/3*2
NotaPuntata=0
Parlato$="You have no more a dotted note width"
EndIf
Case 9
If Terzina=0 AND NuovaLarghezzaEventoBase>5
Terzina=3:NuovaLarghezzaEventoBase/Terzina
If NotaPuntata>0
NotaPuntata=0
Parlato$="You have no more a dotted note width, you have choosen a triplet note width"
Else
If Cinquina>0
Cinquina=0
Parlato$="You have no more a quintet note width, you have choosen a triplet note width"
Else
Parlato$="You have choosen a triplet note width"
EndIf
EndIf
Else
NuovaLarghezzaEventoBase*Terzina
Terzina=0
Parlato$="You have no more a triplet note width"
EndIf
Case 10
If Cinquina=0 AND NuovaLarghezzaEventoBase>9
Cinquina=5:NuovaLarghezzaEventoBase/Cinquina
If NotaPuntata>0
NotaPuntata=0
Parlato$="You have no more a dotted note width, you have choosen a quintet note width"
Else
If Terzina>0
Parlato$="You have no more a triplet note width, you have choosen a quintet note width"
Else
Parlato$="You have choosen a quintet note width"
EndIf
EndIf
Else
NuovaLarghezzaEventoBase*Cinquina
Cinquina=0
Parlato$="You have no more a quintet note width"
EndIf
End Select
If XZonaTopo>0 AND XZonaTopo<11
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
Parlato$+", that are "+Str$(NuovaLarghezzaEventoBase)+" ticks."
EndIf
EndIf
SecondoClicDelTopo=False
TempoTrascorso=Timer
Case 5
SecondoClicDelTopo=True
End Select
; Case #HaiPremutoUnGadget
; XLunSlider=LarghezzaInternaFinestraCambioEventoBase
; Select GadgetHit
; Case 1
; NuovaLarghezzaEventoBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
; NotaPuntata=0:Terzina=0
; Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
; Case 2
; If TipoDiEventoMusicaleDiBase$="PitchBend"
; NuovoInizioCurvaDiPiccoEventoBase=ValoreSlider{2,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
; Else
; NuovoValoreEventoBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
; EndIf
; If TipoDiEventoMusicaleDiBase$="Note" Then Parlato$="You have choosen a note velocity of "+Str$(NuovoValoreEventoBase)+"."
; If TipoDiEventoMusicaleDiBase$="Control" Then Parlato$="You have choosen a value of "+Str$(NuovoValoreEventoBase)+"."
; If TipoDiEventoMusicaleDiBase$="PitchBend"
; Parlato$="You have choosen a bend inital value of "+Str$(NuovoInizioCurvaDiPiccoEventoBase-#_pitchBendCenter)+"."
; EndIf
; Case 3
; NuovaFineCurvaDiPiccoEventoBase=ValoreSlider{3,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
; Parlato$="You have choosen a bend final value of "+Str$(NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
; End Select
; SecondoClicDelTopo=False
; TempoTrascorso=Timer
Case #HaiRilasciatoUnGadget
XLunSlider=LarghezzaInternaFinestraCambioEventoBase
Select GadgetHit
Case 1
NuovaLarghezzaEventoBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
NotaPuntata=0:Terzina=0
Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
Case 2
If TipoDiEventoMusicaleDiBase$="PitchBend"
NuovoInizioCurvaDiPiccoEventoBase=ValoreSlider{2,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
Else
NuovoValoreEventoBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
EndIf
If TipoDiEventoMusicaleDiBase$="Note" Then Parlato$="You have choosen a note velocity of "+Str$(NuovoValoreEventoBase)+"."
If TipoDiEventoMusicaleDiBase$="Control" Then Parlato$="You have choosen a value of "+Str$(NuovoValoreEventoBase)+"."
If TipoDiEventoMusicaleDiBase$="PitchBend"
Parlato$="You have choosen a bend initial value of "+Str$(NuovoInizioCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
EndIf
Case 3
NuovaFineCurvaDiPiccoEventoBase=ValoreSlider{3,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
Parlato$="You have choosen a bend final value of "+Str$(NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
End Select
SecondoClicDelTopo=False
TempoTrascorso=Timer
Case #HaiChiusoLaFinestra
EsciDalCambioEventoBase=True
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$)
Select TastoPremuto$
Case TastoEsc$
EsciDalCambioEventoBase=True
Case TastoCursoreDestra$
If NuovaLarghezzaEventoBase<#TicDiBasePerQuarto*6-2
NuovaLarghezzaEventoBase+2:NotaPuntata=0:Terzina=0:Cinquina=0
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
EndIf
Case TastoCursoreSinistra$
If NuovaLarghezzaEventoBase>3
NuovaLarghezzaEventoBase-2:NotaPuntata=0:Terzina=0:Cinquina=0
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
EndIf
End Select
SecondoClicDelTopo=False
TempoTrascorso=Timer
End Select
Until EsciDalCambioEventoBase=True
If NuovaLarghezzaEventoBase<>LarghezzaEventoBase Then EventoBaseModificato=True
If NuovoValoreEventoBase<>ValoreEventoBase Then EventoBaseModificato=True
LarghezzaEventoBase=NuovaLarghezzaEventoBase
ValoreEventoBase=NuovoValoreEventoBase
If EventiMusicaliSelezionati>0
If EventoBaseModificato=True
Messaggio$="You have made changes:"
Else
Messaggio$="You have made no changes:"
EndIf
Messaggio$+"|Would you apply the current|settings to the selected events?"
ApplicaINuoviValoriAgliEventiMusicaliSelezionati.b=EZRequest("AmySequencer message",Messaggio$,"Yes|No")
If ApplicaINuoviValoriAgliEventiMusicaliSelezionati=1
Select TipoDiEventoMusicaleDiBase$
Case "Note"
AggiustaInizio.b=EZRequest("AmySequencer message","Quantize notes start?","Yes|No")
AggiustaDurata.b=EZRequest("AmySequencer message","Quantize notes length?","Yes|No")
AggiustaValore.b=EZRequest("AmySequencer message","Change notes velocity?","Yes|No")
Case "Program"
AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
Case "Control"
AggiustaInizio=EZRequest("AmySequencer message","Quantize controls start?","Yes|No")
AggiustaValore=EZRequest("AmySequencer message","Change controls value?","Yes|No")
Case "PolyAftertouch"
AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
Case "MonoAftertouch"
AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
Case "PitchBend"
AggiustaInizio=EZRequest("AmySequencer message","Quantize pitch bends start?","Yes|No")
Case "Tempo"
AggiustaInizio=EZRequest("AmySequencer message","Quantize tempo events start?","Yes|No")
Case "BPM"
AggiustaInizio=EZRequest("AmySequencer message","Quantize BPM events start?","Yes|No")
End Select
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
StatoEventoMusicale.b=EventoMusicale()\Stato
SelezioneEventoMusicale.b=StatoEventoMusicale & #EventoMusicaleSelezionato
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
Select EventoMusicale()\Tipo
Case "Note"
If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoBase
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
If AggiustaDurata=1 Then EventoMusicale()\Durata/LarghezzaEventoBase*LarghezzaEventoBase
Case "Program"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
Case "PolyAftertouch"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
Case "MonoAftertouch"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
Case "Control"
If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoBase
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
Case "PitchBend"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
Case "Tempo"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
Case "BPM"
If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
End Select
EndIf
Wend
EndIf
EndIf
If NuovoInizioCurvaDiPiccoEventoBase<>InizioCurvaDiPiccoEventoBase Then Progressione.b=True
If NuovaFineCurvaDiPiccoEventoBase<>FineCurvaDiPiccoEventoBase Then Progressione=True
If Progressione=True
ProgressioneEventiMusicaliCurvaDiPicco{NuovoInizioCurvaDiPiccoEventoBase,NuovaFineCurvaDiPiccoEventoBase}
InizioCurvaDiPiccoEventoBase=NuovoInizioCurvaDiPiccoEventoBase
FineCurvaDiPiccoEventoBase=NuovaFineCurvaDiPiccoEventoBase
EndIf
;*************************************************************
;la seguente linea se attivata da' errore quando non dovrebbe
;the following line if avtivated gives an error when it should not do
;*********************************************************************
; FreeZoneTable(#TabellaZoneCambioEventoBase)
CloseWindow #FinestraCambioEventoBase
Use Window #FinestraEditoreSequenza
;***************************************************
;il seguente comando sembra non avere alcun effetto
;the following command seems have no effect
;*******************************************
; UseZoneTable #TabellaZoneEditoreSequenza
End Statement
;---------------------------------------------------------------
;this procedure states the selected by mouse event new position
;questa procedura mostra la nuova posizione dell'evento selezionato col mouse
;-----------------------------------------------------------------------------
Statement MostraNuovaPosizioneEvento{XEvento.l,YEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraNuovoValore
SHARED ScalaEventiMusicali
SHARED TipoDiEventoMusicaleDiBase$
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
X0.w=16+(XEvento-XInizioAreaVisibile)/ScalaEventiMusicali
Select TipoDiEventoMusicaleDiBase$
Case "Note"
Y0.w=(127-YInizioAreaVisibile-YEvento)*8
X1.w=X0+(LarghezzaEventoBase-1)/ScalaEventiMusicali
Case "Program"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Program000X")*8-1
Case "Control"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Control000X")*8-1
Case "PolyAftertouch"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Poly000X")*8-1
Case "MonoAftertouch"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Mono000X")*8-1
Case "PitchBend"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Bend+0000X")*8-1
Case "Tempo"
Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
X1=X0+Len("Tempo00/00X")*8-1
Case "BPM"
Y0=AreaVisibileDeiValori*Max((97-YEvento+1),0)/97
X1=X0+Len("BPM000X")*8-1
End Select
Y1.w=Y0+7
X0=Min(Max(X0,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y0=Min(Max(Y0,0),AltezzaInternaFinestraEditoreSequenza-1-8-8-7)
X1=Min(Max(X1,16),LarghezzaInternaFinestraEditoreSequenza-1)
Y1=Min(Max(Y1,7),AltezzaInternaFinestraEditoreSequenza-1-8-8)
WJam #SecondaVoltaStessoColore
If MostraNuovoValore=True
WLocate X0,Y0
Select TipoDiEventoMusicaleDiBase$
Case "Note"
Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
Case "Program"
Format "000":Print "Program",Str$(YEvento),"X":Format ""
Case "Control"
Format "000":Print "Control",Str$(YEvento),"X":Format ""
Case "PolyAftertouch"
Format "000":Print "Poly",Str$(YEvento),"X":Format ""
Case "MonoAftertouch"
Format "000":Print "Mono",Str$(YEvento),"X":Format ""
Case "PitchBend"
Format "+0000":Print "Bend",Str$(YEvento*128+EventoMusicale()\Valore-#_PitchBendCenter),"X":Format ""
Case "Tempo"
Format "00":Print "Tempo",Str$(YEvento MOD 16+1),"/",Str$(YEvento/16+1),"X":Format ""
Case "BPM"
Format "000":Print "BPM",Str$(9+YEvento*3+EventoMusicale()\Valore),"X":Format ""
End Select
Else
Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
EndIf
WJam #DueColoriConSfondoPieno
End Statement
;------------------------------------------------------------------------------
;questa procedura permette di spostare gli eventi selezionati cliccando con il
; mouse su uno di essi
;this procedure permits to move the selected events clicking on one of these
;----------------------------------------------------------------------------
Statement MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneEvento.l,YPosizioneEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaEventoBase
SHARED Misure
SHARED MostraNuovoValore
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
XPosizioneEvento/LarghezzaEventoBase*LarghezzaEventoBase
Repeat
NuovaXTopo.w=WMouseX:NuovaYTopo.w=WMouseY:TastoPremutoDelTopo.b=Joyb(0)
TipoDiEventoMusicale$=EventoMusicale()\Tipo
CanaleEvento.b=EventoMusicale()\Canale
Select TipoDiEventoMusicale$
Case "Note"
XNuovaPosizioneNota.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizioneNota/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizioneNota<>XPosizioneEvento
IncrementoXEventoMusicale.l=XNuovaPosizioneNota-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizioneNota.b=127-YInizioAreaVisibile-NuovaYTopo/8
If YNuovaPosizioneNota<>YPosizioneEvento
IncrementoYEventoMusicale.b=YNuovaPosizioneNota-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Note>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "Program"
XNuovaPosizioneProgramma.l=XInizioAreaVisbile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizioneProgramma/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizioneProgramma<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneProgramma-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizioneProgramma.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizioneProgramma<0
If NuovaYTopo<0 Then YNuovaPosizioneProgramma=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneProgramma=0
EndIf
If YNuovaPosizioneProgramma<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneProgramma-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Program>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "Control"
XNuovaPosizioneControllo.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizioneControllo/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizioneControllo<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneControllo-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizioneControllo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizioneControllo<0
If NuovaYTopo<0 Then YNuovaPosizioneControllo=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneControllo=0
EndIf
If YNuovaPosizioneControllo<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneControllo-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Control>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "PolyAftertouch"
XNuovaPosizionePressioneMultipla.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizionePressioneMultipla/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizionePressioneMultipla<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizionePressioneMultipla-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizionePressioneMultipla.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizionePressioneMultipla<0
If NuovaYTopo<0 Then YNuovaPosizionePressioneMultipla=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizionePressioneMultipla=0
EndIf
If YNuovaPosizionePressioneMultipla<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizionePressioneMultipla-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Poly>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "MonoAftertouch"
XNuovaPosizionePressioneSingola.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizionePressioneSingola/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizionePressioneSingola<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizionePressioneSingola-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizionePressioneSingola.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizionePressioneSingola<0
If NuovaYTopo<0 Then YNuovaPosizionePressioneSingola=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizionePressioneSingola=0
EndIf
If YNuovaPosizionePressioneMultipla<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizionePressioneSingola-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Mono>"+Str$(IncrementoYEventoMusicale)
EndIf
Case "PitchBend"
XNuovaPosizioneCurvaDiPicco.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizioneCurvaDiPicco/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizioneCurvaDiPicco<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneCurvaDiPicco-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizioneCurvaDiPicco.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizioneCurvaDiPicco<0
If NuovaYTopo<0 Then YNuovaPosizioneCurvaDiPicco=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneCurvaDiPicco=0
EndIf
If YNuovaPosizioneCurvaDiPicco<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneCurvaDiPicco-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
Messaggio$="Bend>"+Str$(IncrementoYEventoMusicale*128)
EndIf
Case "Tempo"
XNuovaPosizioneTempo.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizioneTempo/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizioneTempo<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneTempo-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizioneTempo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
If YNuovaPosizioneTempo<0
If NuovaYTopo<0 Then YNuovaPosizioneTempo=127
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneTempo=0
EndIf
If YNuovaPosizioneTempo<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneTempo-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
NuoviBattiti.b=IncrementoYEventoMusicale MOD 16
NuoveMisure.b=Abs(IncrementoYEventoMusicale/16)
Messaggio$="Tempo>":If Sgn(IncrementoYEventoMusicale)=-1 Then Messaggio$+"-"
Messaggio$+Str$(NuoviBattiti)+"/"+Str$(NuoveMisure)
EndIf
Case "BPM"
XNuovaPosizioneBattutePerMinuto.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
XNuovaPosizioneBattutePerMinuto/LarghezzaEventoBase*LarghezzaEventoBase
If XNuovaPosizioneBattutePerMinuto<>XPosizioneEvento
IncrementoXEventoMusicale=XNuovaPosizioneBattutePerMinuto-XPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoXEventoMusicale=0
EndIf
YNuovaPosizioneBattutePerMinuto.b=97-NuovaYTopo*97/AreaVisibileDeiValori
If YNuovaPosizioneBattutePerMinuto<0
;---------------------------------------------------------------------------
;il valore massimo per le battute per minuto e' di 97*3, cioe' 291, piu' il
; valore di partenza che e' 10, meno 1 dato che questo e' compreso, fa 300
;the maximum value for BPM events is 97*3, that is 291, plus the start value
; that is 10, minus 1 seen that this is included, it gives 300
;--------------------------------------------------------------
If NuovaYTopo<0 Then YNuovaPosizioneBattutePerMinuto=97
;----------------------------------------------------------------------------
;il valore minimo per le battute per minuto e' di 10, che corrisponde a zero
; dato che viene sommato in seguito
;the minimum value for BPM events is 10, that correspond to zero seen that it
; is added after
;----------------
If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneBattutePerMinuto=0
EndIf
If YNuovaPosizioneBattutePerMinuto<>YPosizioneEvento
IncrementoYEventoMusicale=YNuovaPosizioneBattutePerMinuto-YPosizioneEvento
EventoMusicaleSpostatoConIlTopo=True
Else
IncrementoYEventoMusicale=0
EndIf
If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
EventoMusicaleSpostatoConIlTopo=False
Else
BattutePerMinuto.w=IncrementoYEventoMusicale*3+EventoMusicale()\Valore
Messaggio$="BPM>"+Str$(BattutePerMinuto)
EndIf
End Select
Select TipoDiEventoMusicale$
Case "Note"
NuovaXEvento.l=XNuovaPosizioneNota:NuovaYEvento.b=YNuovaPosizioneNota
Case "Program"
NuovaXEvento=XNuovaPosizioneProgramma:NuovaYEvento=YNuovaPosizioneProgramma
Case "Control"
NuovaXEvento=XNuovaPosizioneControllo:NuovaYEvento=YNuovaPosizioneControllo
Case "PolyAftertouch"
NuovaXEvento=XNuovaPosizionePressioneMultipla:NuovaYEvento=YNuovaPosizionePressioneMultipla
Case "MonoAftertouch"
NuovaXEvento=XNuovaPosizionePressioneSingola:NuovaYEvento=YNuovaPosizionePressioneSingola
Case "PitchBend"
NuovaXEvento=XNuovaPosizioneCurvaDiPicco:NuovaYEvento=YNuovaPosizioneCurvaDiPicco
Case "Tempo"
NuovaXEvento=XNuovaPosizioneTempo:NuovaYEvento=YNuovaPosizioneTempo
Case "BPM"
NuovaXEvento=XNuovaPosizioneBattutePerMinuto:NuovaYEvento=YNuovaPosizioneBattutePerMinuto
End Select
MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
If EventoMusicaleSpostatoConIlTopo=False
Messaggio$="No change made"
EndIf
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
WLocate XMessaggio,YMessaggio
Print SPACE$(80-XMessaggio/8)
WLocate XMessaggio,YMessaggio
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Messaggio$
If EventoMusicaleSpostatoConIlTopo=True
Print " pos>":ConvertiIlTempoInBattute{IncrementoXEventoMusicale,Battiti,Misure,False}
EndIf
VWait
MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
Until TastoPremutoDelTopo<>#TastoSinistroPremutoDelTopo
If EventoMusicaleSpostatoConIlTopo=True
PushItem EventoMusicale()
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Sequenza=SequenzaSelezionata
StatoEventoMusicale.b=EventoMusicale()\Stato
SelezioneEventoMusicale.b=StatoEventoMusicale & #EventoMusicaleSelezionato
If EventoMusicale()\Tipo=TipoDiEventoMusicale$ AND SelezioneEventoMusicale=#EventoMusicaleSelezionato
EventoMusicale()\Evento+IncrementoYEventoMusicale
If TipoDiEventoMusicaleDiBase$="BPM"
EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),97)
If EventoMusicale()\Evento=97 Then EventoMusicale()\Valore=0
If EventoMusicale()\Evento=0 Then EventoMusicale()\Valore=1
Else
EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),127)
EndIf
EventoMusicale()\Inizio+IncrementoXEventoMusicale
If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
EndIf
EndIf
Wend
PopItem EventoMusicale()
EndIf
End Statement
;----------------------------------------
;questa procedura suona la nota corrente
;this procedure plays the current note
;--------------------------------------
Statement SuonaLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED Suono()
SHARED VoceSpenta
SHARED VoceUsata
For Suono.b=0 To 31
If Suono(Suono)\Canale=CanaleNota Then Pop For:Goto FineCicloForEsecutoreNote
Next Suono
FineCicloForEsecutoreNote
If Suono<32
If Suono(Suono)\Canale>0
Periodo.l=PeriFreq(Nota)\Periodo
If Periodo>=#PeriodoMinimo AND Periodo<65536
If VoceSpenta>0
If VoceSpenta BitTst 0=True Then Voce.b=1:VoceSpenta BitClr 0:Goto SuonaCampione
If VoceSpenta BitTst 1=True Then Voce=2:VoceSpenta BitClr 1:Goto SuonaCampione
If VoceSpenta BitTst 2=True Then Voce=4:VoceSpenta BitClr 2:Goto SuonaCampione
If VoceSpenta BitTst 3=True Then Voce=8:VoceSPenta BitClr 3
EndIf
SuonaCampione
SetPeriod Suono,Periodo:Sound Suono,Voce
VoceUsata | Voce
Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
NoteSuonate+1
EndIf
EndIf
Else
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_NoteOn+(CanaleNota-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Nota
WriteSerial 0,VelocitaNota
Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
NoteSuonate+1
EndIf
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleNota-1,16-CanaleNota
Print Messaggio$
EndIf
End Statement
;-----------------------------------------------
;questa procedura esegue il cambio di programma
;this procedure executes the program change
;-------------------------------------------
Statement EseguiIlCambioDiProgramma{Programma.b,CanaleProgramma.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_ProgramChange+(CanaleProgramma-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Programma
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Program>"+Str$(Programma)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleProgramma-1,16-CanaleProgramma
Print Messaggio$
EndIf
EndIf
End Statement
;-----------------------------------------------
;questa procedura esegue il cambio di controllo
;this procedure executes the control change
;-------------------------------------------
Statement EseguiIlCambioDiControllo{Controllo.b,ValoreControllo,CanaleControllo.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_ControlChange+(CanaleControllo-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Controllo
WriteSerial 0,ValoreControllo
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Control>"+Str$(Controllo)+" val>"+Str$(ValoreControllo)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleControllo-1,16-CanaleControllo
Print Messaggio$
EndIf
EndIf
End Statement
;----------------------------------------------
;questa procedura esegue la pressione multipla
;this procedure executes the polyphonic pressure
;------------------------------------------------
Statement EseguiLaPressioneMultipla{PressioneMultipla.b,CanalePressioneMultipla.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_PolyphonicKeyPressure+(CanalePressioneMultipla-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,PressioneMultipla
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Poly>"+Str$(PressioneMultipla)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanalePressioneMultipla-1,16-CanalePressioneMultipla
Print Messaggio$
EndIf
EndIf
End Statement
;---------------------------------------------
;questa procedura esegue la pressione singola
;this procedure executes the single pressure
;--------------------------------------------
Statement EseguiLaPressioneSingola{PressioneSingola.b,CanalePressioneSingola.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_ChannelKeyPressure+(CanalePressioneSingola-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,PressioneMultipla
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Mono>"+Str$(PressioneMultipla)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanalePressioneSingola-1,16-CanalePressioneSingola
Print Messaggio$
EndIf
EndIf
End Statement
;-----------------------------------------------
;questa procedura esegue la variazione di picco
;this procedure executes the pitch bending
;------------------------------------------
Statement EseguiLaCurvaDiPicco{CurvaDiPicco.w,CanaleCurvaDiPicco.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
If MIDIAttivato=True
ByteDiStatoMIDI.b=#_PitchBend+(CanaleCurvaDiPicco-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,CurvaDiPicco MOD 128
WriteSerial 0,CurvaDiPicco/128
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="Bend>"+Str$(CurvaDiPicco-#_PitchBendCenter)
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleCurvaDiPicco-1,16-CanaleCurvaDiPicco
Print Messaggio$
EndIf
EndIf
End Statement
;-----------------------------------------------------
;questa procedura interrompe la nota suonata corrente
;this procedure stops the current played note
;---------------------------------------------
Statement SmettiDiSuonareLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED VoceSpenta
SHARED VoceUsata
If VoceUsata>0
If VoceUsata BitTst 0=True Then Voce.b=1:Goto FermaCampione
If VoceUsata BitTst 1=True Then Voce=2:Goto FermaCampione
If VoceUsata BitTst 2=True Then Voce=4:Goto FermaCampione
If VoceUsata BitTst 3=True Then Voce=8
FermaCampione
Quiet Voce
VoceSpenta | Voce
Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
NoteSuonate-1
Else
If MIDIAttivato=True
ByteDiStatoMIDI=#_NoteOff+(CanaleNota-1)
WriteSerial 0,ByteDiStatoMIDI
WriteSerial 0,Nota
WriteSerial 0,VelocitaNota
Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
NoteSuonate-1
EndIf
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$+" stopped"
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour CanaleNota-1,16-CanaleNota
Print Messaggio$
EndIf
End Statement
;---------------------------------------------------------
;questa procedura mostra gli slider dell'editore sequenza
;this procedure shows the sequence editor's sliders
;---------------------------------------------------
Statement MostraSliderEditoreSequenza{}
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED DurataSequenza
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
MostraSlider{1,YInizioAreaVisibile,AreaInvisibileDelleNote,"VERTICAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
If AreaInvisibileDelTempo=0
Disable #ListaGadgetEditoreSequenza,2
XInizioAreaVisibile=0
Else
Enable #ListaGadgetEditoreSequenza,2
EndIf
MostraSlider{2,XInizioAreaVisibile,AreaInvisibileDelTempo,"HORIZONTAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
End Statement
;-----------------------------------------------------------
;questa procedura disegna le note di sfondo con i loro nomi
;this procedure draws the notes background with note names
;----------------------------------------------------------
Statement MostraLeNoteDiSfondoConILoroNomi{}
SHARED AreaInvisibileDelleNote
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED TipoDiNota()
SHARED YInizioAreaVisibile
For Tasto.b=0 To 127-AreaInvisibileDelleNote
Nota.b=127-Tasto-YInizioAreaVisibile
Y0Nota.w=Tasto*8:Y1Nota.w=Y0Nota+7
If TipoDiNota(Nota)\Diesis=True
WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,0
WColour 3,0
Else
WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,3
WColour 0,3
EndIf
WLocate 16,Y0Nota
Print "Note ",Nota,">"
Print TipoDiNota(Nota)\NomeInglese
Print "-"
Print TipoDiNota(Nota)\NomeItaliano
Print TipoDiNota(Nota)\Ottava
Next Tasto
End Statement
;-----------------------------------------------
;questa procedura mostra i numeri delle battute
;this procedure shows the bar numbers
;-------------------------------------
Statement MostraLeBattute{}
SHARED AreaInvisibileDelleNote
SHARED Battiti
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
Nota.b=127-YInizioAreaVisibile-(127-AreaInvisibileDelleNote)
Nota$=Str$(Nota):OttavaNota$=Str$(TipoDiNota(Nota)\Ottava):NomeIngleseNota$=TipoDiNota(Nota)\NomeInglese
NomeItalianoNota$=TipoDiNota(Nota)\NomeItaliano
LarghezzaTesto.w=Len("Note "+Nota$+">"+NomeIngleseNota$+"-"+NomeItalianoNota$+OttavaNota$+" ")*8
FineTempo.l=XInizioAreaVisibile+(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
If TipoDiNota(Nota)\Diesis=True Then WColour 3,0 Else WColour 0,3
Battito.b=1
Misura.l=1
Tempo.l=0
Repeat
PushItem EventoMusicale()
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Sequenza=SequenzaSelezionata AND EventoMusicale()\Inizio<=Tempo
EventoMusicaleEseguito.b=EventoMusicale()\Stato & #EventoMusicaleEseguito
If EventoMusicale()\Tipo="Tempo" AND EventoMusicaleEseguito=0
NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
NuoveMisure.b=EventoMusicale()\Evento/16+1
If Battito>1
Battito=1
Misura+1
EndIf
TempoCambiato=True
EventoMusicale()\Stato | #EventoMusicaleEseguito
EndIf
EndIf
Wend
PopItem EventoMusicale()
XTempo.l=16+(Tempo-XInizioAreaVisibile)/ScalaEventiMusicali
If XTempo>16+LarghezzaTesto-1
WLocate XTempo,(127-AreaInvisibileDelleNote)*8
Print Misura,".",Battito
If TempoCambiato=True
Tic.w=Tempo MOD (#TicDiBasePerQuarto/(NuoveMisure/4.0))
Else
Tic=Tempo MOD (#TicDiBasePerQuarto/(Misure/4.0))
EndIf
If Tic>0 Then Print ".",Tic
EndIf
Battute.b=Max(ScalaEventiMusicali/4,1)
If TempoCambiato=True
IncrementoTempo.w=(#TicDiBasePerQuarto*4.0*Battute)/NuoveMisure
Else
IncrementoTempo=(#TicDiBasePerQuarto*4.0*Battute)/Misure
EndIf
Battito+Battute
Tempo+IncrementoTempo
If TempoCambiato=True
If Battito>NuoviBattiti Then Misura+Battito/NuoveMisure:Battito=1
Else
If Battito>Battiti Then Misura+Battito/Misure:Battito=1
EndIf
Until Tempo>FineTempo
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Tipo="Tempo"
EventoMusicaleEseguito=EventoMusicale()\Stato & #EventoMusicaleEseguito
If EventoMusicaleEseguito=#EventoMusicaleEseguito
EventoMusicale()\Stato & %11110111
EndIf
EndIf
Wend
End Statement
;--------------------------------------------
;questa procedura mostra gli eventi musicali
;this procedure shows musical events
;------------------------------------
Statement MostraGliEventiMusicali{}
SHARED CanaleSelezionato
SHARED EventoMusicale()
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED SequenzaSelezionata
SHARED TipoDiEventoMusicaleDiBase$
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Sequenza=SequenzaSelezionata
TipoDiEventoMusicale$=EventoMusicale()\Tipo
If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
CanaleEvento.b=EventoMusicale()\Canale
If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
InizioEvento.l=EventoMusicale()\Inizio
StatoEvento.b=EventoMusicale()\Stato
Select TipoDiEventoMusicale$
Case "Note"
Nota.b=EventoMusicale()\Evento:DurataNota.l=EventoMusicale()\Durata
DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,StatoEvento}
Case "Program"
Programma.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,StatoEvento}
Case "Control"
Controllo.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,StatoEvento}
Case "PolyAftertouch"
PressioneMultipla.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"PolyAftertouch",PressioneMultipla,InizioEvento,0,CanaleEvento,StatoEvento}
Case "MonoAftertouch"
PressioneSingola.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"MonoAftertouch",PressioneSingola,InizioEvento,0,CanaleEvento,StatoEvento}
Case "PitchBend"
CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
DisegnaUnEventoMusicale{"PitchBend",CurvaDiPicco,InizioEvento,0,CanaleEvento,StatoEvento}
Case "Tempo"
Tempo.b=EventoMusicale()\Evento
DisegnaUnEventoMusicale{"Tempo",Tempo,InizioEvento,0,CanaleEvento,StatoEvento}
Case "BPM"
BattutePerMinuto.w=EventoMusicale()\Evento*3+EventoMusicale()\Valore
DisegnaUnEventoMusicale{"BPM",BattutePerMinuto,InizioEvento,0,CanaleEvento,StatoEvento}
End Select
EndIf
EndIf
EndIf
Wend
End Statement
;--------------------------------------------
;questa procedura esegue gli eventi musicali
;this procedure executes the musical events
;-------------------------------------------
Statement EseguiGliEventiMusicali{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED BattutePerMinuto
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED FineMotivo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TastoEsc$
SHARED XInizioAreaVisibile
PushItem Sequenza()
TicPerCinquantesimoDiSecondo.f=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
Tempo.l=0
If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
FineEsecuzione.l=FineMotivo
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
FineEsecuzione=DurataSequenza
FineTempoVisibile.l=(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
EndIf
Repeat
EventoEsecutoreEventiMusicaliMusicali.l=Event
Select EventoEsecutoreEventiMusicali
Case #HaiChiusoLaFinestra
Pop Repeat:Goto FineCicloRepeatEsecuzione
Case #HaiPremutoUnTasto
TastoPremuto$=Inkey$
End Select
ResetList EventoMusicale()
While NextItem(EventoMusicale())
SequenzaEventoMusicale.l=EventoMusicale()\Sequenza
If SequenzaEventoMusicale=SequenzaSelezionata OR Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
Sequenza.l=0
ResetList Sequenza()
While NextItem(Sequenza())=True
Sequenza+1
If Sequenza=SequenzaEventoMusicale
Pop While:Goto FineCicloWhileEsecuzione
EndIf
Wend
FineCicloWhileEsecuzione
InizioEventoMusicale.l=Sequenza()\Inizio+EventoMusicale()\Inizio
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
InizioEventoMusicale=EventoMusicale()\Inizio
EndIf
TipoDiEventoMusicale$=EventoMusicale()\Tipo
DurataEventoMusicale.l=EventoMusicale()\Durata
FineEventoMusicale.l=InizioEventoMusicale+DurataEventoMusicale-1
ValoreEventoMusicale.b=EventoMusicale()\Valore
CanaleEventoMusicale.b=EventoMusicale()\Canale
EventoMusicaleEseguito.b=EventoMusicale()\Stato & #EventoMusicaleEseguito
EventoMusicaleTerminato.b=EventoMusicale()\Stato & #EventoMusicaleTerminato
If EventoMusicaleEseguito=0 AND EventoMusicaleTerminato=0 AND Tempo>=InizioEventoMusicale
If CanaleEventoMusicale<>CanaleSelezionato AND MostraSoloGliEventiMusicaliDelCanaleSelezionato=True
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza Then TipoDiEventoMusicale$=""
EndIf
If TipoDiEventoMusicale$<>""
Select TipoDiEventoMusicale$
Case "Note"
Nota.b=EventoMusicale()\Evento
VelocitaNota.b=ValoreEventoMusicale
SuonaLaNota{Nota,VelocitaNota,CanaleEventoMusicale,Modo}
Case "Program"
Programma.b=EventoMusicale()\Evento
EseguiIlCambioDiProgramma{Programma,CanaleEventoMusicale,Modo}
Case "Control"
Controllo.b=EventoMusicale()\Evento
ValoreConttrollo.b=ValoreEventoMusicale
EseguiIlCambioDiControllo{Controllo,ValoreControllo,CanaleEventoMusicale,Modo}
Case "PolyAftertouch"
PressioneMultipla.b=EventoMusicale()\Evento
EseguiLaPressioneMultipla{PressionMultipla,CanaleEventoMusicale,Modo}
Case "MonoAftertouch"
PressioneSingola.b=EventoMusicale()\Evento
EseguiLaPressioneSingola{PressioneSingola,CanaleEventoMusicale,Modo}
Case "PitchBend"
CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
EseguiLaCurvaDiPicco{CurvaDiPicco,CanaleEventoMusicale,Modo}
Case "Tempo"
NuovoTempo.b=EventoMusicale()\Evento
MostraIlTempo{NuovoTempo,CanaleEventoMusicale,Modo}
Case "BPM"
NuoveBattutePerMinuto.w=9+EventoMusicale()\Evento*3+EventoMusicale()\Valore
TicPerCinquantesimoDiSecondo=(NuoveBattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
MostraLeBattutePerMinuto{NuoveBattutePerMinuto,CanaleEventoMusicale,Modo}
End Select
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
Evento.b=EventoMusicale()\Evento
InizioEvento.l=InizioEventoMusicale
DurataEvento.l=DurataEventoMusicale
ValoreEvento.b=ValoreEventoMusicale
CanaleEvento.b=CanaleEventoMusicale
If TipoDiEventoMusicale$="PitchBend"
CurvaDiPicco.w=Evento*128+ValoreEvento
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
Else
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
EndIf
EndIf
EventoMusicale()\Stato | #EventoMusicaleEseguito
EndIf
EndIf
If EventoMusicaleEseguito=#EventoMusicaleEseguito AND EventoMusicaleTerminato=0 AND Tempo>=FineEventoMusicale
If CanaleEventoMusicale=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
If TipoDiEventoMusicale$<>""
If TipoDiEventoMusicale$="Note"
Nota=EventoMusicale()\Evento
VelocitaNota=EventoMusicale()\Valore
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEventoMusicale,Modo}
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
Evento=EventoMusicale()\Evento
ValoreEvento=EventoMusicale()\Valore
InizioEvento=InizioEventoMusicale
DurataEvento=DurataEventoMusicale
CanaleEvento=CanaleEventoMusicale
StatoOriginaleEvento.b=EventoMusicale()\Stato & %11110111
If TipoDiEventoMusicale$="PitchBend"
CurvaDiPicco.w=Evento*128+ValoreEvento
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,StatoOriginaleEvento}
Else
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,StatoOriginaleEvento}
EndIf
EndIf
EventoMusicale()\Stato | #EventoMusicaleTerminato
EndIf
EndIf
EndIf
EndIf
Wend
VWait
Tempo+TicPerCinquantesimoDiSecondo
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
If Tempo-XInizioAreaVisibile>FineTempoVisibile
XInizioAreaVisibile=Tempo
MostraLeNoteDiSfondoConILoroNomi{}
MostraLeBattute{}
MostraGliEventiMusicali{}
MostraSliderEditoreSequenza{}
EndIf
EndIf
Until Tempo>=FineEsecuzione OR TastoPremuto$=TastoEsc$ OR TastoPremuto$=" "
FineCicloRepeatEsecuzione
ResetList EventoMusicale()
While NextItem(EventoMusicale())
EventoMusicaleEseguito.b=EventoMusicale()\Stato & #EventoMusicaleEseguito
If EventoMusicale()\Tipo="Note" AND EventoMusicaleEseguito=#EventoMusicaleEseguito
Nota=EventoMusicale()\Evento
VelocitaNota=EventoMusicale()\Valore
CanaleNota.b=EventoMusicale()\Canale
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,Modo}
EndIf
EventoMusicale()\Stato & %11100111
Wend
PopItem Sequenza()
Quiet %1111
End Statement
;----------------------------------------------------------
;questa procedura interrompe l'esecuzione di tutte le note
;this procedure stops all notes execution
;-----------------------------------------
Statement InterrompiTutteLeNote{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
If MIDIAttivato=True
For CanaleNote.b=1 To 16
EseguiIlCambioDiControllo{#_AllNotesOff,127,CanaleNota,Modo}
EseguiIlCambioDiControllo{#_ResetCtrl,127,CanaleNota,Modo}
Next CanaleNote
EndIf
Quiet %1111
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
Messaggio$="All notes off"
Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
WLocate XMessaggio,YMessaggio
WColour 1,0
Print Messaggio$
EndIf
End Statement
Statement AggiungiUnaNotaDallaTastiera{Nota$}
SHARED AreaInvisibileDelleNote
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED NotaSuonata
SHARED OttavaSelezionata
SHARED PuntoDInserimento
SHARED SequenzaSelezionata
SHARED ValoreEventoBase
Select Nota$
Case "C1"
Nota.b=0
Case "C#1"
Nota=1
Case "D1"
Nota=2
Case "D#1"
Nota=3
Case "E1"
Nota=4
Case "F1"
Nota=5
Case "F#1"
Nota=6
Case "G1"
Nota=7
Case "G#1"
Nota=8
Case "A1"
Nota=9
Case "A#1"
Nota=10
Case "B1"
Nota=11
Case "C2"
Nota=12
Case "C#2"
Nota=13
Case "D2"
Nota=14
Case "D#2"
Nota=15
Case "E2"
Nota=16
Case "F2"
Nota=17
Case "F#2"
Nota=18
Case "G2"
Nota=19
Case "G#2"
Nota=20
Case "A2"
Nota=21
Case "A#2"
Nota=22
Case "B2"
Nota=23
End Select
Nota+OttavaSelezionata*12:Nota=Min(Nota,127)
If CanaleSelezionato>0
LastItem EventoMusicale()
If AddItem(EventoMusicale())=True
EventiMusicali+1
EventoMusicale()\Tipo="Note"
EventoMusicale()\Evento=Nota
EventoMusicale()\Valore=ValoreEventoBase
EventoMusicale()\Inizio=PuntoDInserimento
EventoMusicale()\Canale=CanaleSelezionato
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Stato=#EventoMusicaleNonSelezionato
EventoMusicale()\Durata=LarghezzaEventoBase
If NotaSuonata\Stato=True
Nota.b=NotaSuonata\Evento
VelocitaNota.b=NotaSuonata\Valore
CanaleNota.b=NotaSuonata\Canale
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiMusicaliDallEditoreSequenza}
EndIf
NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Valore,EventoMusicale()\Inizio,EventoMusicale()\Durata
NotaSuonata\Canale=EventoMusicale()\Canale
SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
NotaSuonata\Stato=True
PuntoDInserimento+LarghezzaEventoBase
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
EndIf
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
End Statement
;-------------------------------------------------------
;questa procedura imposta il menu dell'editore sequenza
;this procedure sets the sequence editor menu
;---------------------------------------------
Statement ImpostaMenuEditoreSequenza{}
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED MostraNuovoValore
SHARED TipoDiEventoMusicaleDiBase$
Free MenuList #ListaMenuEditoreSequenza
MenuTitle #ListaMenuEditoreSequenza,0,"Controls"
MenuItem #ListaMenuEditoreSequenza,0,0,0,"Play"
MenuItem #ListaMenuEditoreSequenza,0,0,1,"Record"
MenuTitle #ListaMenuEditoreSequenza,1,"Edit"
MenuItem #ListaMenuEditoreSequenza,0,1,0,"All"
MenuItem #ListaMenuEditoreSequenza,0,1,1,"None"
MenuItem #ListaMenuEditoreSequenza,0,1,2,"Toggle"
MenuItem #ListaMenuEditoreSequenza,0,1,3,"Cut"
MenuItem #ListaMenuEditoreSequenza,0,1,4,"Copy"
MenuItem #ListaMenuEditoreSequenza,0,1,5,"Paste"
MenuItem #ListaMenuEditoreSequenza,0,1,6,"Forget"
MenuItem #ListaMenuEditoreSequenza,0,1,7,"Goto"
MenuTitle #ListaMenuEditoreSequenza,2,"Event type"
Select TipoDiEventoMusicaleDiBase$
Case "Note"
MenuItem #ListaMenuEditoreSequenza,4,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,7," BPM"
Case "Program"
MenuItem #ListaMenuEditoreSequenza,2,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,4,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,7," BPM"
Case "Control"
MenuItem #ListaMenuEditoreSequenza,2,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,4,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,7," BPM"
Case "PolyAftertouch"
MenuItem #ListaMenuEditoreSequenza,2,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,4,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,7," BPM"
Case "MonoAftertouch"
MenuItem #ListaMenuEditoreSequenza,2,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,4,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,7," BPM"
Case "PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,4,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,7," BPM"
Case "Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,4,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,2,2,7," BPM"
Case "BPM"
MenuItem #ListaMenuEditoreSequenza,2,2,0," Note"
MenuItem #ListaMenuEditoreSequenza,2,2,1," Program"
MenuItem #ListaMenuEditoreSequenza,2,2,2," Control"
MenuItem #ListaMenuEditoreSequenza,2,2,3," PolyPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,4," MonoPressure"
MenuItem #ListaMenuEditoreSequenza,2,2,5," PitchBend"
MenuItem #ListaMenuEditoreSequenza,2,2,6," Tempo"
MenuItem #ListaMenuEditoreSequenza,4,2,7," BPM"
End Select
If MostraSoloGliEventiMusicaliDelloStessoTipo=True
MenuItem #ListaMenuEditoreSequenza,3,2,8," Alone"
Else
MenuItem #ListaMenuEditoreSequenza,1,2,8," Alone"
EndIf
MenuTitle #ListaMenuEditoreSequenza,3,"Settings"
MenuItem #ListaMenuEditoreSequenza,0,3,0,"Basic event"
If MostraNuovoValore=True
MenuItem #ListaMenuEditoreSequenza,3,3,1," Show dragged event value"
Else
MenuItem #ListaMenuEditoreSequenza,1,3,1," Show dragged event value"
EndIf
MenuTitle #ListaMenuEditoreSequenza,4,"Help"
MenuItem #ListaMenuEditoreSequenza,0,4,0,"Keys to use"
MenuItem #ListaMenuEditoreSequenza,0,4,1,"Notes on keys"
;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
SetMenu #ListaMenuEditoreSequenza
End Statement
;------------------------------------------------------------
;questa procedura selezione e/o modifica gli eventi musicali
;this procedure selectes and/or modifies the musical events
;-----------------------------------------------------------
Statement Selezione{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED EventoMusicaleSelezionato
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoBase
SHARED MIDIAttivato
SHARED Misure
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED NotaSuonata
SHARED PeriFreq()
SHARED PuntoDInserimento
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED Suono()
SHARED TastoDelTopoCliccato
SHARED TipoDiEventoMusicaleDiBase$
SHARED ValoreEventoBase
SHARED XInizioAreaVisibile
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YTopo
ResetList EventoMusicale()
StessoEvento.b=%00000
XTopo=Min(Max(XTopo,16),LarghezzaInternaFinestraEditoreSequenza-1)
While NextItem(EventoMusicale())=True
StessoEvento=%00000
TipoDiEventoMusicale$=EventoMusicale()\Tipo
If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
CanaleEvento.b=EventoMusicale()\Canale
If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
InizioEvento.l=EventoMusicale()\Inizio
SequenzaEvento.w=EventoMusicale()\Sequenza
SelezioneEventoMusicale.b=EventoMusicale()\Stato & #EventoMusicaleSelezionato
EventoMusicaleTagliato.b=EventoMusicale()\Stato & #EventoMusicaleTagliato
EventoMusicaleCopiato.b=EventoMusicale()\Stato & #EventoMusicaleCopiato
If Modo=#SelezionaUnEventoMusicale
Select TipoDiEventoMusicale$
Case "Note"
YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
Nota.b=EventoMusicale()\Evento
DurataNota.l=EventoMusicale()\Durata
FineNota.l=InizioEvento+DurataNota-1
VelocitaNota.b=EventoMusicale()\Valore
XPosizioneNota.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizioneNota.b=127-YInizioAreaVisibile-YTopo/8
If XPosizioneNota>=InizioEvento Then StessoEvento | %00001
If XPosizioneNota<=FineNota Then StessoEvento | %00010
If YPosizioneNota=Nota Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new note|with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneNota,YPosizioneNota}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
Else
Nota=EventoMusicale()\Evento
InizioNota=EventoMusicale()\Inizio
EndIf
Else
NotaPiuLunga.l=DurataNota
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
NotaSuonata\Evento=Nota,VelocitaNota,0,DurataNota,CanaleEvento
SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
NotaSuonata\Stato=True
EventoMusicaleSelezionato=EventoMusicale()\Evento
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
Case "Program"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
Programma.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Program000")*8
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
FineProgramma.w=InizioEvento+LunghezzaEvento-1
XPosizioneProgramma.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizioneProgramma.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneProgramma>=InizioEvento Then StessoEvento | %00001
If XPosizioneProgramma<=FineProgramma Then StessoEvento | %00010
If YPosizioneProgramma=Programma Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento=EZRequest("AmySequencer message","Would you add a new program|with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneProgramma,YPosizioneProgramma}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
EndIf
Else
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
EventoMusicaleSelezionato=EventoMusicale()\Evento
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
Case "Control"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
Controllo.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Control000")*8
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
FineControllo.w=InizioEvento+LunghezzaEvento-1
XPosizioneControllo.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizioneControllo.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneControllo>=InizioEvento Then StessoEvento | %00001
If XPosizioneControllo<=FineControllo Then StessoEvento | %00010
If YPosizioneControllo=Controllo Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento=EZRequest("AmySequencer message","Would you add a new control|with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneControllo,YPosizioneControllo}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
EndIf
Else
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
EventoMusicaleSelezionato=EventoMusicale()\Evento
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
Case "PolyAftertouch"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
PressioneMultipla.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Poly000")*8
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
FinePressioneMultipla.w=InizioEvento+LunghezzaEvento-1
XPosizionePressioneMultipla.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizionePressioneMultipla.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizionePressioneMultipla>=InizioEvento Then StessoEvento | %00001
If XPosizionePressioneMultipla<=FinePressioneMultipla Then StessoEvento | %00010
If YPosizionePressioneMultipla=PressioneMultipla Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento=EZRequest("AmySequencer message","Would you add a new poly|pressure with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizionePressioneMultipla,YPosizionePressioneMultipla}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
EndIf
Else
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
EventoMusicaleSelezionato=EventoMusicale()\Evento
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
Case "MonoAftertouch"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
PressioneSingola.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Mono000")*8
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
FinePressioneSingola.w=InizioEvento+LunghezzaEvento-1
XPosizionePressioneSingola.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizionePressioneSingola.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizionePressioneSingola>=InizioEvento Then StessoEvento | %00001
If XPosizionePressioneSingola<=FinePressioneSingola Then StessoEvento | %00010
If YPosizionePressioneSingola=PressioneSingola Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento=EZRequest("AmySequencer message","Would you add a new mono|pressure with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizionePressioneSingola,YPosizionePressioneSingola}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
EndIf
Else
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
EventoMusicaleSelezionato=EventoMusicale()\Evento
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
Case "PitchBend"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
CurvaDiPicco.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Bend+0000")*8
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
FineCurvaDiPicco.w=InizioEvento+LunghezzaEvento-1
XPosizioneCurvaDiPicco.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizioneCurvaDiPicco.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneCurvaDiPicco>=InizioEvento Then StessoEvento | %00001
If XPosizioneCurvaDiPicco<=FineCurvaDiPicco Then StessoEvento | %00010
If YPosizioneCurvaDiPicco=CurvaDiPicco Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento=EZRequest("AmySequencer message","Would you add a new pitch bend|with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneCurvaDiPicco,YPosizioneCurvaDiPicco}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
EndIf
Else
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
EventoMusicaleSelezionato=EventoMusicale()\Evento
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
Case "Tempo"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
Tempo.b=EventoMusicale()\Evento
LunghezzaEvento.w=Len("Tempo00/00")*8
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
FineTempo.w=InizioEvento+LunghezzaEvento-1
XPosizioneTempo.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizioneTempo.b=127-YTopo*127/AreaVisibileDeiValori
If XPosizioneTempo>=InizioEvento Then StessoEvento | %00001
If XPosizioneTempo<=FineTempo Then StessoEvento | %00010
If YPosizioneTempo=Tempo Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento=EZRequest("AmySequencer message","Would you add a new tempo|with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneTempo,YPosizioneTempo}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
EndIf
Else
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
EventoMusicaleSelezionato=EventoMusicale()\Evento*128+EventoMusicale()\Valore
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
Case "BPM"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
BattutePerMinuto.b=EventoMusicale()\Evento
LunghezzaLunghezzaEvento.w=Len("BPM000")*8
If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
FineBattutePerMinuto.w=InizioEvento+LunghezzaEvento-1
XPosizioneBattutePerMinuto.l=XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali
YPosizioneBattutePerMinuto.b=97-YTopo*97/AreaVisibileDeiValori
If XPosizioneBattutePerMinuto>=InizioEvento Then StessoEvento | %00001
If XPosizioneBattutePerMinuto<=FineBattutePerMinuto Then StessoEvento | %00010
If YPosizioneBattutePerMinuto=BattutePerMinuto Then StessoEvento | %00100
If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
If StessoEvento=%01111
If CanaleSelezionato<>CanaleEvento
If CanaleSelezionato=0
CanaleSelezionato=CanaleEvento
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
Else
AggiungiEvento=EZRequest("AmySequencer message","Would you add a new BPM|with the current channel?","Yes|No")
If AggiungiEvento=1
CanaleEvento=CanaleSelezionato
Else
Format "00"
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
CanaleSelezionato=CanaleEvento
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
StessoEvento | %10000
EndIf
EndIf
Else
TipoDiEventoMusicaleDiBase$=TipoDiEventoMusicale$
ImpostaMenuEditoreSequenza{}
StessoEvento | %10000
EndIf
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
If TastoDelTopoCliccato=#TastoSinistroPremutoDelTopo
MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneBattutePerMinuto,YPosizioneBattutePerMinuto}
EndIf
If EventoMusicaleSpostatoConIlTopo=False
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
EndIf
Else
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EndIf
EventoMusicaleSelezionato=EventoMusicale()\Evento
Pop If:Pop Select:Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileSelezione
EndIf
End Select
Else
If EventoMusicale()\Sequenza=SequenzaSelezionata
If SelezioneEventoMusicale=#EventoMusicaleSelezionato
Select Modo
Case #CambiaIlCanaleDegliEventiMusicaliSelezionati
EventoMusicale()\Canale=CanaleSelezionato
Case #AlzaDiUnoGliEventiMusicaliSelezionati
If TipoDiEventoMusicale$="BPM"
If EventoMusicale()\Evento<97
EventoMusicale()\Valore+1
If EventoMusicale()\Valore>2
EventoMusicale()\Valore=0:EventoMusicale()\Evento+1
EndIf
EndIf
Else
If EventoMusicale()\Evento<127 Then EventoMusicale()\Evento+1
EndIf
Case #AbbassaDiUnoGliEventiMusicaliSelezionati
If TipoDiEventoMusicale$="BPM"
If EventoMusicale()\Evento>0
EventoMusicale()\Valore-1
If EventoMusicale()\Valore<0
EventoMusicale()\Valore=2:EventoMusicale()\Evento-1
EndIf
Else
If EventoMusicale()\Valore>1 Then EventoMusicale()\Valore-1
EndIf
Else
If EventoMusicale()\Evento>0 Then EventoMusicale()\Evento-1
EndIf
Case #SpostaAvantiNelTempoGliEventiMusicaliSelezionati
EventoMusicale()\Inizio+LarghezzaEventoBase
Case #SpostaIndietroNelTempoGliEventiMusicaliSelezionati
EventoMusicale()\Inizio-LarghezzaEventoBase:If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
Case #EliminaGliEventiMusicaliSelezionati
EventiMusicaliSelezionati-1
DurataEventoMusicale.l=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
KillItem EventoMusicale():EventiMusicali-1
If EventiMusicali=0 Then DurataSequenza=0
Case #DeselezionaTuttiGliEventiMusicali
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
Case #InvertiLaSelezioneDiTuttiGliEventiMusicali
EventiMusicaliSelezionati-1
EventoMusicale()\Stato & %11111110
Case #TagliaGliEventiMusicaliSelezionati
EventoMusicale()\Stato | #EventoMusicaleTagliato
Case #CopiaGliEventiMusicaliSelezionati
EventoMusicale()\Stato | #EventoMusicaleCopiato
End Select
Select TipoDiEventoMusicale$
Case "Note"
Select Modo
Case #AllungaLaDurataDelleNoteSelezionate
If EventoMusicale()\Durata=#_MClksPerSP
EventoMusicale()\Durata=LarghezzaEventoBase
Else
EventoMusicale()\Durata+LarghezzaEventoBase
EndIf
NotaPiuLunga=Max(NotaPiuLunga,EventoMusicale()\Durata)
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
Case #RiduciLaDurataDelleNoteSelezionate
EventoMusicale()\Durata-LarghezzaEventoBase
EventoMusicale()\Durata=Max(EventoMusicale()\Durata,#_MClksPerSP)
NotaPiuLunga=Max(EventoMusicale()\Durata,NotaPiuLunga)
Case #AlzaDiUnOttavaLeNoteSelezionate
EventoMusicale()\Evento+12
EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
Case #AbbassaDiUnOttavaLeNoteSelezionate
EventoMusicale()\Evento-12
EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
Case #CambiaIlValoreDegliEventiMusicaliSelezionati
EventoMusicale()\Valore=ValoreEventoBase
End Select
Case "Tempo"
NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
NuoveMisure.b=EventoMusicale()\Evento/16+1
Select Modo
Case #AggiungiUnBattitoAlTempoSelezionato
NuoviBattiti+1
NuoviBattiti=Min(NuoviBattiti,16)
Case #TogliUnBattitoAlTempoSelezionato
NuoviBattiti-1
NuoviBattiti=Max(NuoviBattiti,1)
Case #AggiungiUnaMisuraAlTempoSelezionato
NuoveMisure+1
NuoveMisure=Min(NuoveMisure,8)
Case #TogliUnaMisuraAlTempoSelezionato
NuoveMisure-1
NuoveMisure=Max(NuoveMisure,1)
End Select
EventoMusicale()\Evento=(NuoveMisure-1)*16+NuoviBattiti-1
Case "BPM"
Select Modo
Case #AggiungiDieciAgliEventiMusicaliSelezionati
If EventoMusicale()\Evento<94
EventoMusicale()\Evento+3
EventoMusicale()\Valore+1
If EventoMusicale()\Valore>2
EventoMusicale()\Valore=0:EventoMusicale()\Evento+1
EndIf
EndIf
Case #SottraiDieciAgliEventiMusicaliSelezionati
If EventoMusicale()\Evento>3
EventoMusicale()\Evento-3:EventoMusicale()\Valore-1
If EventoMusicale()\Valore<0
EventoMusicale()\Evento-1:EventoMusicale()\Valore=2
EndIf
Else
If EventoMusicale()\Evento>2 AND EventoMusicale()\Valore>1
EventoMusicale()\Evento-3:EventoMusicale()\Valore-1
EndIf
EndIf
End Select
Default
Select Modo
Case #AggiungiDieciAgliEventiMusicaliSelezionati
EventoMusicale()\Evento+10
EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
Case #SottraiDieciAgliEventiMusicaliSelezionati
EventoMusicale()\Evento-10
EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
End Select
End Select
Else
Select Modo
Case #SelezionaTuttiGliEventiMusicali
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
Case #InvertiLaSelezioneDiTuttiGliEventiMusicali
EventiMusicaliSelezionati+1
EventoMusicale()\Stato | #EventoMusicaleSelezionato
End Select
EndIf
If Modo=#IncollaGliEventiMusicali AND EventoMusicaleTagliato=#EventoMusicaleTagliato
EventoMusicale()\Inizio+PuntoDInserimento
EventoMusicale()\Stato & %11111101
EventoMusicale()\Stato & #EventoMusicaleCopiato
EndIf
EndIf
EndIf
EndIf
EndIf
Wend
FineCicloWhileSelezione
If Modo=#SelezionaUnEventoMusicale AND StessoEvento<%11111
If CanaleSelezionato>0
LastItem EventoMusicale()
If AddItem(EventoMusicale())=True
EventiMusicali+1
EventoMusicale()\Inizio=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
EventoMusicale()\Canale=CanaleSelezionato
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Stato=0
EventoMusicale()\Tipo=TipoDiEventoMusicaleDiBase$
Select TipoDiEventoMusicaleDiBase$
Case "Note"
YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
EventoMusicale()\Evento=127-YInizioAreaVisibile-YTopo/8
EventoMusicale()\Valore=ValoreEventoBase
EventoMusicale()\Durata=LarghezzaEventoBase
NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Valore,0,EventoMusicale()\Durata,EventoMusicale()\Canale
SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
NotaSuonata\Stato=True
Case "Program"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Evento=Min(EventoMusicale()\Evento,98)
EventoMusicale()\Durata=2
Case "Control"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
EventoMusicale()\Valore=ValoreEventoBase
Case "PolyAftertouch"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
Case "MonoAftertouch"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
Case "PitchBend"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
Case "Tempo"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
EventoMusicale()\Durata=2
Case "BPM"
YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
EventoMusicale()\Evento=97-YTopo*97/AreaVisibileDeiValori
If EventoMusicale()\Evento=97 Then EventoMusicale()\Valore=0
If EventoMusicale()\Evento=0 Then EventoMusicale()\Valore=1
EventoMusicale()\Durata=2
End Select
If TipoDiEventoMusicaleDiBase$="PitchBend"
EventoMusicaleSelezionato=EventoMusicale()\Evento*128+EventoMusicale()\Valore
Else
EventoMusicaleSelezionato=EventoMusicale()\Evento
EndIf
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
EndIf
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
EndIf
If Modo=#IncollaGliEventiMusicali
If CanaleSelezionato>0
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
SequenzaEvento=EventoMusicale()\Sequenza
If SequenzaEvento=SequenzaSelezionata
TipoDiEventoMusicale$=EventoMusicale()\Tipo
If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
CanaleEvento=EventoMusicale()\Canale
If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
EventoMusicaleCopiato=EventoMusicale()\Stato & #EventoMusicaleCopiato
If EventoMusicaleCopiato=#EventoMusicaleCopiato
EventoMusicale=EventoMusicale()\Evento
ValoreEvento.b=EventoMusicale()\Valore
InizioEvento=EventoMusicale()\Inizio
DurataEvento.l=EventoMusicale()\Durata
If DifferenzaPosizioneEventoMusicale.l=0 Then DifferenzaPosizioneEventoMusicale=PuntoDInserimento-InizioEvento
PushItem EventoMusicale()
LastItem EventoMusicale()
If AddItem(EventoMusicale())=True
EventiMusicali+1
EventiMusicaliSelezionati+1
EventoMusicale()\Tipo=TipoDiEventoMusicale$
EventoMusicale()\Evento=EventoMusicale
EventoMusicale()\Valore=ValoreEvento
EventoMusicale()\Inizio=InizioEvento+DifferenzaPosizioneEventoMusicale
EventoMusicale()\Durata=DurataEvento
EventoMusicale()\Canale=CanaleSelezionato
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Stato=#EventoMusicaleSelezionato
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
EndIf
PopItem EventoMusicale()
EndIf
EndIf
EndIf
EndIf
Wend
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
EndIf
If Modo=#DimenticaGliEventiMusicaliTagliatiOCopiati
If CanaleSelezionato>0
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
SequenzaEvento=EventoMusicale()\Sequenza
If SequenzaEvento=SequenzaSelezionata
TipoDiEventoMusicale$=EventoMusicale()\Tipo
If TipoDiEventoMusicale$=TipoDiEventoMusicaleDiBase$ OR MostraSoloGliEventiMusicaliDelloStessoTipo=False
CanaleEvento=EventoMusicale()\Canale
If CanaleEvento=CanaleSelezionato OR MostraSoloGliEventiMusicaliDelCanaleSelezionato=False
EventoMusicaleCopiato=EventoMusicale()\Stato & #EventoMusicaleCopiato
If EventoMusicaleCopiato=#EventoMusicaleCopiato
EventoMusicale()\Stato & %11111001
EndIf
EndIf
EndIf
EndIf
Wend
Else
EZRequest "AmySequencer message","You must select a channel first","OK"
EndIf
EndIf
If Modo=#SelezionaGliEventiMusicaliUguali
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Canale=CanaleSelezionato AND EventoMusicale()\Sequenza=SequenzaSelezionata
If EventoMusicale()\Tipo="PitchBend"
If EventoMusicale()\Evento*128+EventoMusicale()\Valore=EventoMusicaleSelezionato
If EventoMusicale()\Stato & #EventoMusicaleSelezionato=0
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EventiMusicaliSelezionati+1
EndIf
EndIf
Else
If EventoMusicale()\Evento=EventoMusicaleSelezionato
If EventoMusicale()\Stato & #EventoMusicaleSelezionato=0
EventoMusicale()\Stato | #EventoMusicaleSelezionato
EventiMusicaliSelezionati+1
EndIf
EndIf
EndIf
EndIf
Wend
EndIf
If NotaPiuLunga>0
XMessaggio.w=#LarghezzaPulsantiEditoreSequenza
YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
WLocate XMessaggio,YMessaggio
WColour 3,2
Print SPACE$(80-XMessaggio/8)
WLocate XMessaggio,YMessaggio
Print "Len>":ConvertiIlTempoInBattute{NotaPiuLunga,Battiti,Misure,True}
EndIf
DurataSequenza=0
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Sequenza=SequenzaSelezionata
DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
EndIf
Wend
LimiteMassimoXInizioAreaVisibile.l=Max(DurataSequenza-(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali,0)
XInizioAreaVisibile=Min(XInizioAreaVisibile,LimiteMassimoXInizioAreaVisibile)
End Statement
;-------------------------------------------------------------------------
;questa procedura gestisce il titolo della finestra dell'editore sequenza
;this procedure handles the sequence editor window title
;--------------------------------------------------------
Statement MostraIlTitoloDellaFinestraDellEditoreSequenza{}
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED Sequenza()
SHARED SequenzaSelezionata
TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+":"
NomeSequenza$=Sequenza()\Nome
If NomeSequenza$="" Then NomeSequenza$="unnamed"
TitoloFinestra$+NomeSequenza$+"-"
If EventiMusicali>0
TitoloFinestra$+Str$(EventiMusicaliSelezionati)+" selected event"
If EventiMusicaliSelezionati<>1 Then TitoloFinestra$+"s"
TitoloFinestra$+" of "+Str$(EventiMusicali)+" event"
If EventiMusicali<>1 Then TitoloFinestra$+"s"
Else
TitoloFinestra$+"no events into this sequence"
EndIf
WTitle TitoloFinestra$
End Statement
;----------------------------------------------
;questa procedura registra gli eventi musicali
;this procedure records the musical events
;------------------------------------------
Statement RegistraGliEventiMusicali{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED Battiti
SHARED BattutePerMinuto
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TastoCursoreGiu$
SHARED TastoCursoreSu$
SHARED TastoEsc$
SHARED XInizioAreaVisibile
If SequenzaSelezionata>0
Messaggio$="Begin recording?|If you'll choose|OK use CURSOR KEYS|UP & DOWN to change|BPM and press SPACE|to end recording"
Registrazione.b=EZRequest("AmySequencer message",Messaggio$,"OK|Cancel")
If Registrazione=0 Then Statement Return
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
FineTempoVisibile.l=(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
EndIf
Battito.b=Misure
TicPerCinquantesimoDiSecondo.f=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
Tempo.l=0
Repeat
EventoRegistratoreEventiMusicali.l=Event
Select EventoRegistratoreEventiMusicali
Case #HaiChiusoLaFinestra
Pop Select:Pop Repeat:Statement Return
Case #HaiPremutoUnTasto
TastoPremuto$=Inkey$
Select TastoPremuto$
Case TastoCursoreSu$
If BattutePerMinuto<300
BattutePerMinuto+1
TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
MostraLeBattutePerMinuto{BattutePerMinuto,10,Modo}
EndIf
Case TastoCursoreGiu$
If BattutePerMinuto>10
BattutePerMinuto-1
TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
MostraLeBattutePerMinuto{BattutePerMinuto,10,Modo}
EndIf
End Select
End Select
ByteDiStato.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
TipoDiEventoMusicale.b=ByteDiStato & #_StatusBits
CanaleEvento.b=ConvertiOltreCentoventisetteInNegativo{ByteDiStato & #_ChannelBits}+1
Select TipoDiEventoMusicale
Case #_NoteOn
TipoDiEventoMusicale$="Note"
Evento.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
ValoreEvento.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Case #_NoteOff
TipoDiEventoMusicale$="NoteOff"
Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Case #_ProgramChange
TipoDiEventoMusicale$="Program"
Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Case #_ControlChange
TipoDiEventoMusicale$="Control"
Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Case #_PolyphonicKeyPressure
TipoDiEventoMusicale$="PolyAftertouch"
Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Case #_ChannelKeyPressure
TipoDiEventoMusicale$="MonoAftertouch"
Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Case #_PitchBend
TipoDiEventoMusicale$="PitchBend"
ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
Default
TipoDiEventoMusicale$=""
End Select
If TipoDiEventoMusicale$<>""
If TipoDiEventoMusicale$<>"NoteOff"
LastItem EventoMusicale()
If AddItem(EventoMusicale())=True
EventoMusicale()\Tipo=TipoDiEventoMusicale$
EventoMusicale()\Evento=Evento
EventoMusicale()\Inizio=Tempo
EventoMusicale()\Canale=CanaleEvento
EventoMusicale()\Sequenza=SequenzaSelezionata
EventoMusicale()\Durata=2
If TipoDiEventoMusicale$="Note" Then EventoMusicale()\Valore=ValoreEvento
If TipoDiEventoMusicale$="Control" Then EventoMusicale()\Valore=ValoreEvento
If TipoDiEventoMusicale$="PitchBend" Then EventoMusicale()\Valore=ValoreEvento
Select TipoDiEventoMusicale$
Case "Note"
Nota.b=EventoMusicale()\Evento
SuonaLaNota{Nota,ValoreEvento,CanaleEvento,Modo}
Case "Program"
Programma.b=EventoMusicale()\Evento
EseguiIlCambioDiProgramma{Programma,CanaleEvento,Modo}
Case "Control"
Controllo.b=EventoMusicale()\Evento:ValoreEvento=EventoMusicale()\Valore
EseguiIlCambioDiControllo{Controllo,ValoreEvento,CanaleEvento,Modo}
Case "PolyAftertouch"
PressioneMultipla.b=EventoMusicale()\Evento
EseguiLaPressioneMultipla{PressioneMultipla,CanaleEvento,Modo}
Case "MonoAftertouch"
PressioneSingola.b=EventoMusicale()\Evento
EseguiLaPressioneSingola{PressioneSingola,CanaleEvento,Modo}
Case "PitchBend"
CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
EseguiLaCurvaDiPicco{CurvaDiPicco,CanaleEvento,Modo}
End Select
EventoMusicale()\Stato | #EventoMusicaleEseguito
If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
Sequenza()\EventiMusicali+1
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
EventiMusicali+1:MostraIlTitoloDellaFinestraDellEditoreSequenza{}
EndIf
Else
EZRequest "AmySequencer message","You have used all the available events","OK"
Statement Return
EndIf
Else
SmettiDiSuonareLaNota{Evento,ValoreEvento,CanaleEvento,Modo}
EventoMusicale()\Stato & %11110111
EventoMusicale()\Stato | #EventoMusicaleTerminato
EndIf
EndIf
VWait
Tempo+TicPerCinquantesimoDiSecondo
If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
Sequenza()\Durata=Tempo-Sequenza()\Inizio+1
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
If Tempo-XInizioAreaVisibile>FineTempoVisibile
XInizioAreaVisibile=Tempo
MostraLeNoteDiSfondoConILoroNomi{}
MostraLeBattute{}
MostraSliderEditoreSequenza{}
EndIf
Sequenza()\Durata=Tempo+1
DurataSequenza=Tempo+1
EndIf
TempoMetronomo.w+TicPerCinquantesimoDiSecondo
If TempoMetronomo>=(#TicDiBasePerQuarto*1.0*Battiti)/Misure
If NotaMetronomoSuonata.b=True
SmettiDiSuonareLaNota{76,0,10,Modo}
TempoMetronomo=0
NotaMetronomoSuonata=False
Else
SuonaLaNota{76,(127.0*Battito)/Misure,10,Modo}
Battito-1:If Battito=0 Then Battito=Misure
NotaMetronomoSuonata=True
EndIf
EndIf
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
TipoDiEventoMusicale$=EventoMusicale()\Tipo
Evento=EventoMusicale()\Evento
ValoreEvento=EventoMusicale()\Valore
InizioEvento.l=EventoMusicale()\Inizio
DurataEvento.l=EventoMusicale()\Durata
CanaleEvento=EventoMusicale()\Canale
StatoEvento.b=EventoMusicale()\Stato
EventoMusicaleEseguito.b=StatoEvento & #EventoMusicaleEseguito
If EventoMusicaleEseguito=#EventoMusicaleEseguito
If TipoDiEventoMusicale$="Note" Then EventoMusicale()\Durata=Tempo-InizioEvento+1
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
If TipoDiEventoMusicale$="PitchBend"
CurvaDiPicco.w=Evento*128+ValoreEvento
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
Else
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleEseguito}
EndIf
EndIf
If InizioEvento+DurataEvento-1>=Tempo
EventoMusicale()\Stato & %11110111
EventoMusicale()\Stato | #EventoMusicaleTerminato
EndIf
EndIf
EventoMusicaleTerminato.b=StatoEvento & #EventoMusicaleTerminato
If EventoMusicaleTerminato=#EventoMusicaleTerminato
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
If TipoDiEventoMusicale$="PitchBend"
CurvaDiPicco=Evento*128+ValoreEvento
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,StatoEvento}
Else
DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,StatoEvento}
EndIf
EndIf
EventoMusicale()\Stato & %11101111
EndIf
Wend
Until TastoPremuto$=TastoEsc$ OR TastoPremuto$=" "
If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
Sequenza()\Durata=Tempo-Sequenza()\Inizio+1
EndIf
If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
DurataSequenza=Tempo+1
EndIf
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
EventoMusicale()\Stato & %11100111
Wend
Else
EZRequest "AmySequencer message","You must select a sequence first","OK"
EndIf
End Statement
;-----------------------------------------------
;questa procedura mostra il punto d'inserimento
;this procedure shows the insertion point
;-----------------------------------------
Statement MostraIlPuntoDInserimento{}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED CanaleSelezionato
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED PuntoDInserimento
SHARED ScalaEventiMusicali
SHARED XInizioAreaVisibile
I.w=16+(PuntoDInserimento-XInizioAreaVisibile)/ScalaEventiMusicali
If I>=16 AND I+7<LarghezzaInternaFinestraEditoreSequenza
If CanaleSelezionato>0
ColoreTestoPuntoDInserimento=CanaleSelezionato-1
ColoreSfondoPuntoDInserimento=16-CanaleSelezionato
Else
ColoreTestoPuntoDInserimento=3
EndIf
WBox I,0,I+7,AltezzaInternaFinestraEditoreSequenza-8-8,ColoreSfondoPuntoDInserimento
TestoPuntoDInserimento$="Insertion point>"
For TestoPuntoDInserimento.b=0 To 15
WLocate I,TestoPuntoDInserimento*8
WColour ColoreTestoPuntoDInserimento,ColoreSfondoPuntoDInserimento
Print Mid$(TestoPuntoDInserimento$,TestoPuntoDInserimento+1,1)
Next TestoPuntoDInserimento
EndIf
End Statement
;-------------------------------------------------------------
;questa procedura permette di editare la sequenza selezionata
;this procedure permits to edit the selected sequence
;-----------------------------------------------------
Statement EditoreSequenza{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaSchermo
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoBase
SHARED LarghezzaSchermo
SHARED MIDIAttivato
SHARED Misure
SHARED MostraSoloGliEventiMusicaliDelloStessoTipo
SHARED MostraSoloGliEventiMusicaliDelCanaleSelezionato
SHARED MostraNuovoValore
SHARED NotaSuonata
SHARED NoteSuonate
SHARED OttavaSelezionata
SHARED PeriFreq()
SHARED PrimaVoltaNellEditoreSequenza
SHARED PuntoDInserimento
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED TastoDelTopoCliccato
SHARED TastoBackspace$
SHARED TastoCursoreDestra$
SHARED TastoCursoreGiu$
SHARED TastoCursoreSinistra$
SHARED TastoCursoreSu$
SHARED TastoEsc$
SHARED TicPerCinquantesimoDiSecondo
SHARED TipoDiEventoMusicaleDiBase$
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED XLunSlider
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YLunSlider
SHARED YTopo
;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
MenuColour 3
XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
TipoFinestra.l=#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
DurataSequenza=Max(Sequenza()\Durata,(#TicDiBasePerQuarto*4.0*Battiti)/Misure)
EventiMusicali=Sequenza()\EventiMusicali
EventiMusicaliSelezionati=Sequenza()\EventiMusicaliSelezionati
Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1
MostraIlTitoloDellaFinestraDellEditoreSequenza{}
LarghezzaInternaFinestraEditoreSequenza=InnerWidth
AltezzaInternaFinestraEditoreSequenza=InnerHeight
CloseWindow #FinestraEditoreSequenza
AreaInvisibileDelleNote.b=128-(AltezzaInternaFinestraEditoreSequenza-8-8)/8
AreaVisibileDeiValori.w=(128-AreaInvisibileDelleNote)*8-1-7
XLunSlider=16
YLunSlider=AltezzaInternaFinestraEditoreSequenza-8-8
ImpostaSlider{1,0,0,"VERTICAL",0,#ListaGadgetEditoreSequenza}
XLunSlider=LarghezzaInternaFinestraEditoreSequenza-16
YLunSlider=8
ImpostaSlider{2,16,AltezzaInternaFinestraEditoreSequenza-8-8,"HORIZONTAL",0,#ListaGadgetEditoreSequenza}
Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetEditoreSequenza
MostraIlTitoloDellaFinestraDellEditoreSequenza{}
;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
WindowFont #FonteDiCaratteriTopaz8
WJam #DueColoriConSfondoPieno
SetZone 0,0,0,LarghezzaInternaFinestraEditoreSequenza-1,AltezzaInternaFinestraEditoreSequenza-1-8-8
MostraLaScalaDegliEventiMusicali{False}
SetZone 1,0,AltezzaInternaFinestraEditoreSequenza-8-8,7,AltezzaInternaFinestraEditoreSequenza-8-8+7
SetZone 2,8,AltezzaInternaFinestraEditoreSequenza-8-8,15,AltezzaInternaFinestraEditoreSequenza-8-8+7
Format "00"
For Canale.b=1 To 16
X0Canale.w=(Canale-1)*16:Y0Canale.w=AltezzaInternaFinestraEditoreSequenza-8
WLocate X0Canale,Y0Canale
If Canale=CanaleSelezionato
WColour Canale-1,16-Canale
Else
If ColoriOriginali=True
WColour Canale MOD 2+1,Canale MOD 2
Else
WColour 10+(Canale MOD 2)*2,9+(Canale MOD 2)*2
EndIf
EndIf
Print Canale
SetZone Canale+2,X0Canale,Y0Canale,X0Canale+15,Y0Canale+7
Next Canale
Format ""
SetZone Canale+2,X0Canale+16,Y0Canale,#LarghezzaPulsantiEditoreSequenza-1,Y0Canale+7
WLocate X0Canale+16,Y0Canale
If MostraSoloGliEventiMusicaliDelCanaleSelezionato=True Then WColour 3,2 Else WColour 2,1
Print "Alone"
; WLocate X0Canale+16,Y0Canale
; If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
; Print "All":SetZone 19,X0Canale+16,Y0Canale,X0Canale+16+23,Y0Canale+7
; WLocate X0Canale+16+8*3,Y0Canale
; If ColoriOriginali=True Then WColour 1,0 Else WColour 15,14
; Print "None":SetZone 20,X0Canale+16+8*3,Y0Canale,X0Canale+16+8*3+8*4-1,Y0Canale+7
; WLocate X0Canale+16+8*3+8*4,Y0Canale
; If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
; Print "Toggle":SetZone 21,X0Canale+16+8*3+8*4,Y0Canale,X0Canale+16+8*3+8*4+8*6-1,Y0Canale+7
If PrimaVoltaNellEditoreSequenza=True
;--------------------------------------------------------------------------
;questa variabile indica la nota d'inizio delle note nell'editore sequenza
;this variable states the beginning note in the sequence editor
;---------------------------------------------------------------
YInizioAreaVisibile=127-(127-AreaInvisibileDelleNote)-#_MiddleC
EndIf
Repeat
If SecondoClicDelTopo.b=False
AreaInvisibileDelTempo=DurataSequenza-(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
AreaInvisibileDelTempo=Max(AreaInvisibileDelTempo,0)
MostraSliderEditoreSequenza{}
ImpostaMenuEditoreSequenza{}
MostraIlTitoloDellaFinestraDellEditoreSequenza{}
MostraLeNoteDiSfondoConILoroNomi{}
MostraLeBattute{}
MostraGliEventiMusicali{}
MostraIlPuntoDInserimento{}
SecondoClicDelTopo=True
EndIf
If PrimaVoltaNellEditoreSequenza=True
MostraITastiDaUsare{}
MostraLaMappaturaDelleNoteSullaTastiera{}
PrimaVoltaNellEditoreSequenza=False
EndIf
If NotaSuonata\Stato=True
Nota.b=NotaSuonata\Evento:FineNota.l=NotaSuonata\Durata-1
VelocitaNota.b=NotaSuonata\Valore:CanaleNota.b=NotaSuonata\Canale
DurataNota.l=(Timer-TempoTrascorso.l)*TicPerCinquantesimoDiSecondo
If DurataNota>FineNota
SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiMusicaliDallEditoreSequenza}
NotaSuonata\Stato=False
EndIf
EndIf
If NoteSuonate>0 AND NotaSuonata\Stato=False
If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)+" notes"
Messaggio$+" still playing:|clicking on OK you will stop "
If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
EZRequest "AmySequencer message",Messaggio$,"OK"
InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallEditoreSequenza}
NoteSuonate=0
EndIf
EventoFinestraEditoreSequenza.l=Event
Select EventoFinestraEditoreSequenza
Case #HaiPremutoUnTastoDelTopo
XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato=MButtons
ZonaTopo.b=Zone(XTopo,YTopo)
Select TastoDelTopoCliccato
Case #TastoSinistroPremutoDelTopo
Select ZonaTopo
Case 0
Selezione{#SelezionaUnEventoMusicale}
Case 1
ScalaEventiMusicali/2:If ScalaEventiMusicali=0 Then ScalaEventiMusicali=64
MostraLaScalaDegliEventiMusicali{True}
Case 2
ScalaEventiMusicali+ScalaEventiMusicali:If ScalaEventiMusicali=128 Then ScalaEventiMusicali=1
MostraLaScalaDegliEventiMusicali{True}
Case 3
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=1:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 4
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=2:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 5
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=3:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 6
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=4:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
Format ""
Case 7
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=5:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 8
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=6:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 9
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=7:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 10
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=8:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 11
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=9:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 12
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=10:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 13
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=11:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 14
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=12:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 15
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=13:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 16
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=14:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 17
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=15:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 18
Format "00"
If CanaleSelezionato>0
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
If ColoriOriginali=True
WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
Else
WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
EndIf
Print Str$(CanaleSelezionato)
EndIf
CanaleSelezionato=16:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
WColour CanaleSelezionato-1,16-CanaleSelezionato
Print Str$(CanaleSelezionato)
Format ""
Case 19
MostraSoloGliEventiMusicaliDelCanaleSelezionato=NOT MostraSoloGliEventiMusicaliDelCanaleSelezionato
WLocate 16*16,AltezzaInternaFinestraEditoreSequenza-8
If MostraSoloGliEventiMusicaliDelCanaleSelezionato=True Then WColour 3,2 Else WColour 2,1
Print "Alone"
End Select
TempoTrascorso.l=Timer
SecondoClicDelTopo=False
Case #TastoSinistroDelTopoRilasciato
If Timer-TempoTrascorso>49 AND ZonaTopo=0
Selezione{#SelezionaGliEventiMusicaliUguali}
SecondoClicDelTopo=False
Else
SecondoClicDelTopo=True
EndIf
End Select
; Case #HaiPremutoUnGadget
; Select GadgetHit
; Case 1
; AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
; YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
; Case 2
; LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
; XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
; XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
; End Select
Case #HaiRilasciatoUnGadget
Select GadgetHit
Case 1
AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
Case 2
LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
End Select
SecondoClicDelTopo=False
Case #HaiAttivatoIlMenu
If MenuHit=0 AND ItemHit=0 Then EseguiGliEventiMusicali{#EseguiGliEventiMusicaliDallEditoreSequenza}
If MenuHit=0 AND ItemHit=1 Then RegistraGliEventiMusicali{#EseguiGliEventiMusicaliDallEditoreSequenza}
If MenuHit=1 AND ItemHit=0 Then Selezione{#SelezionaTuttiGliEventiMusicali}
If MenuHit=1 AND ItemHit=1 Then Selezione{#DeselezionaTuttiGliEventiMusicali}
If MenuHit=1 AND ItemHit=2 Then Selezione{#InvertiLaSelezioneDiTuttiGliEventiMusicali}
If MenuHit=1 AND ItemHit=3 Then Selezione{#TagliaGliEventiMusicaliSelezionati}
If MenuHit=1 AND ItemHit=4 Then Selezione{#CopiaGliEventiMusicaliSelezionati}
If MenuHit=1 AND ItemHit=5 Then Selezione{#IncollaGliEventiMusicali}
If MenuHit=1 AND ItemHit=6 Then Selezione{#DimenticaGliEventiMusicaliTagliatiOCopiati}
If MenuHit=1 AND ItemHit=7 Then XInizioAreaVisibile=PuntoDInserimento
If MenuHit=2 AND ItemHit=0 Then TipoDiEventoMusicaleDiBase$="Note"
If MenuHit=2 AND ItemHit=1 Then TipoDiEventoMusicaleDiBase$="Program"
If MenuHit=2 AND ItemHit=2 Then TipoDiEventoMusicaleDiBase$="Control"
If MenuHit=2 AND ItemHit=3 Then TipoDiEventoMusicaleDiBase$="PolyAftertouch"
If MenuHit=2 AND ItemHit=4 Then TipoDiEventoMusicaleDiBase$="MonoAftertouch"
If MenuHit=2 AND ItemHit=5 Then TipoDiEventoMusicaleDiBase$="PitchBend"
If MenuHit=2 AND ItemHit=6 Then TipoDiEventoMusicaleDiBase$="Tempo"
If MenuHit=2 AND ItemHit=7 Then TipoDiEventoMusicaleDiBase$="BPM"
If MenuHit=2 AND ItemHit=8 Then MostraSoloGliEventiMusicaliDelloStessoTipo=NOT MostraSoloGliEventiMusicaliDelloStessoTipo
If MenuHit=3 AND ItemHit=0 Then CambiaLEventoBase{}
If MenuHit=3 AND ItemHit=1 Then MostraNuovoValore=NOT MostraNuovoValore
If MenuHit=4 AND ItemHit=0 Then MostraITastiDaUsare{}
If MenuHit=4 AND ItemHit=1 Then MostraLaMappaturaDelleNoteSullaTastiera{}
SecondoClicDelTopo=False
Case #HaiChiusoLaFinestra
EsciDallEditoreSequenza.b=True
Case #HaiPremutoUnTasto
TastoPremuto$=LCase$(Inkey$):TastoRiga.w=RawKey
If TastoPremuto$=TastoEsc$ Then EsciDallEditoreSequenza=True
Select TastoRiga
Case 2
Nota$="C#2"
Case 3
Nota$="D#2"
Case 5
Nota$="F#2"
Case 6
Nota$="G#2"
Case 7
Nota$="A#2"
Case 16
Nota$="C2"
Case 17
Nota$="D2"
Case 18
Nota$="E2"
Case 19
Nota$="F2"
Case 20
Nota$="G2"
Case 21
Nota$="A2"
Case 22
Nota$="B2"
Case 33
Nota$="C#1"
Case 34
Nota$="D#1"
Case 36
Nota$="F#1"
Case 37
Nota$="G#1"
Case 38
Nota$="A#1"
Case 49
Nota$="C1"
Case 50
Nota$="D1"
Case 51
Nota$="E1"
Case 52
Nota$="F1"
Case 53
Nota$="G1"
Case 54
Nota$="A1"
Case 55
Nota$="B1"
Case 80
OttavaSelezionata=0
Case 81
OttavaSelezionata=1
Case 82
OttavaSelezionata=2
Case 83
OttavaSelezionata=3
Case 84
OttavaSelezionata=4
Case 85
OttavaSelezionata=5
Case 86
OttavaSelezionata=6
Case 87
OttavaSelezionata=7
Case 88
OttavaSelezionata=8
Case 89
OttavaSelezionata=9
Default
TastoRiga=0
End Select
If TastoRiga>0
If TastoRiga<80
AggiungiUnaNotaDallaTastiera{Nota$}
Else
YInizioAreaVisibile=Max(127-(127-AreaInvisibileDelleNote)-OttavaSelezionata*12,0)
EndIf
EndIf
TastiShiftPremuti.b=(Qualifier-$8000) & %11
If EventiMusicaliSelezionati>0
If TastiShiftPremuti>0
Select TastoPremuto$
Case TastoBackspace$
Selezione{#EliminaGliEventiMusicaliSelezionati}
Case TastoCursoreSu$
If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#AlzaDiUnOttavaLeNoteSelezionate}
If TipoDiEventoMusicaleDiBase$="Program" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="Control" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="PolyAftertouch" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="MonoAftertouch" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="Tempo" Then Selezione{#AggiungiUnaMisuraAlTempoSelezionato}
If TipoDiEventoMusicaleDiBase$="BPM" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
Case TastoCursoreGiu$
If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#AbbassaDiUnOttavaLeNoteSelezionate}
If TipoDiEventoMusicaleDiBase$="Program" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="Control" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="PolyAftertouch" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="MonoAftertouch" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
If TipoDiEventoMusicaleDiBase$="Tempo" Then Selezione{#TogliUnaMisuraAlTempoSelezionato}
If TipoDiEventoMusicaleDiBase$="BPM" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
Case TastoCursoreDestra$
If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#AllungaLaDurataDelleNoteSelezionate}
Case TastoCursoreSinistra$
If TipoDiEventoMusicaleDiBase$="Note" Then Selezione{#RiduciLaDurataDelleNoteSelezionate}
End Select
Else
Select TastoPremuto$
Case TastoBackspace$
If LastItem(EventoMusicale())=True
If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
DurataEventoMusicale.l=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
DurataSequenza-DurataEventoMusicale
XInizioAreaVisibile-DurataEventoMusicale
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
KillItem EventoMusicale():EventiMusicali-1
EndIf
Case TastoCursoreSu$
If TipoDiEventoMusicaleDiBase$="Tempo"
Selezione{#AggiungiUnBattitoAlTempoSelezionato}
Else
Selezione{#AlzaDiUnoGliEventiMusicaliSelezionati}
EndIf
Case TastoCursoreGiu$
If TipoDiEventoMusicaleDiBase$="Tempo"
Selezione{#TogliUnBattitoAlTempoSelezionato}
Else
Selezione{#AbbassaDiUnoGliEventiMusicaliSelezionati}
EndIf
Case TastoCursoreDestra$
Selezione{#SpostaAvantiNelTempoGliEventiMusicaliSelezionati}
Case TastoCursoreSinistra$
Selezione{#SpostaIndietroNelTempoGliEventiMusicaliSelezionati}
End Select
EndIf
Else
If TastiShiftPremuti>0
Select TastoPremuto$
Case TastoBackspace$
If LastItem(EventoMusicale())=True
If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
DurataEventoMusicale=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
DurataSequenza-DurataEventoMusicale
XInizioAreaVisibile-DurataEventoMusicale
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
KillItem EventoMusicale():EventiMusicali-1
EndIf
Case TastoCursoreDestra$
PuntoDInserimento+LarghezzaEventoBase
PuntoDInserimento=Min(PuntoDInserimento,DurataSequenza)
Case TastoCursoreSinistra$
PuntoDInserimento-LarghezzaEventoBase
PuntoDInserimento=Max(PuntoDInserimento,0)
End Select
Else
Select TastoPremuto$
Case TastoBackspace$
If LastItem(EventoMusicale())=True
If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
DurataEventoMusicale=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
DurataSequenza-DurataEventoMusicale
XInizioAreaVisibile-DurataEventoMusicale
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
KillItem EventoMusicale():EventiMusicali-1
EndIf
Case TastoCursoreSu$
If YInizioAreaVisibile>0 Then YInizioAreaVisibile-1
Case TastoCursoreGiu$
If YInizioAreaVisibile<AreaInvisibileDelleNote Then YInizioAreaVisibile+1
Case TastoCursoreDestra$
XInizioAreaVisibile+LarghezzaEventoBase
XInizioAreaVisibile=Min(XInizioAreaVisibile,AreaInvisibileDelTempo)
Case TastoCursoreSinistra$
XInizioAreaVisibile-LarghezzaEventoBase
XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
End Select
EndIf
EndIf
If TastoPremuto$=" "
ResetList EventoMusicale()
While NextItem(EventoMusicale())
If EventoMusicale()\Inizio>=PuntoDInserimento
EventoMusicale()\Inizio+LarghezzaEventoBase
EndIf
Wend
PuntoDInserimento+LarghezzaEventoBase
DurataSequenza+LarghezzaEventoBase
EndIf
SecondoClicDelTopo=False
End Select
Until EsciDallEditoreSequenza=True
Sequenza()\EventiMusicali=EventiMusicali
Sequenza()\EventiMusicaliSelezionati=EventiMusicaliSelezionati
Sequenza()\Durata=DurataSequenza
CloseWindow #FinestraEditoreSequenza
Use Window #FinestraPrincipale
WJam #UnColoreConSfondoTrasparente
End Statement
;------------------------------------------------------------------------------
;questa procedura elimina tutti gli eventi musicali della sequenza selezionata
;this procedure deletes all the events of the selected sequence
;-----------------------------------------------------------------
Statement EliminaTuttiGliEventiMusicaliDellaSequenza{}
SHARED EventoMusicale()
SHARED Sequenza()
SHARED SequenzaSelezionata
If Sequenza()\EventiMusicali>0
ResetList EventoMusicale()
While NextItem(EventoMusicale())=True
If EventoMusicale()\Sequenza=SequenzaSelezionata
If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato
Sequenza()\EventiMusicaliSelezionati-1
EndIf
Sequenza()\EventiMusicali-1
KillItem EventoMusicale()
EndIf
Wend
EndIf
End Statement
;-----------------------------------------------------------
;questa procedura cambia il nome della sequenza selezionata
;this procedure change the selected sequence's name
;---------------------------------------------------
Statement CambiaIlNomeDellaSequenzaSelezionata{}
SHARED Sequenza()
SHARED SequenzaSelezionata
Use Window #FinestraPrincipale
WJam #DueColoriConSfondoPieno
WLocate 0,0:WColour 0,0:Print SPACE$(80)
WLocate 0,0:WColour 3:Print "Please type the new name for the sequence>"
NuovoNomeDellaSequenzaSelezionata$=StripLead$(StripTrail$(Edit$("Sequence "+Str$(SequenzaSelezionata),39),Asc(" ")),Asc(" "))
If NuovoNomeDellaSequenzaSelezionata$<>"" Then Sequenza()\Nome=NuovoNomeDellaSequenzaSelezionata$
WJam #UnColoreConSfondoTrasparente
End Statement
;---------------------------------------------
;questa procedura mostra la sequenza indicata
;this procedure shows the stated sequence
;-----------------------------------------
Statement MostraSequenza{Nome$,Inizio.l,Durata.l,Traccia,EventiMusicali.l,ModoDisegno.b}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza
SHARED TracceVisibili
SHARED XTracceVisibili
SHARED YTracceVisibili
Y0.w=(Traccia-YTracceVisibili)*8:Y1.w=Y0+7
If Y0>=8 AND Y1<8+TracceVisibili*8
Fine.l=Inizio+Durata-1
I.w=16+Inizio-XTracceVisibili
F.w=16+Fine-XTracceVisibili
If I>=16 AND I<LarghezzaInternaFinestraPrincipale
InizioSequenzaVisibile.b=True
Else
InizioSequenzaVisibile=False
EndIf
If F>=16 AND F<LarghezzaInternaFinestraPrincipale
FineSequenzaVisibile.b=True
Else
FineSequenzaVisibile=False
EndIf
If I<16 AND F>LarghezzaInternaFinestraPrincipale
SequenzaVisibile.b=True
Else
If InizioSequenzaVisibile=True OR FineSequenzaVisibile=True
SequenzaVisibile=True
Else
SequenzaVisibile=False
EndIf
EndIf
If SequenzaVisibile=True
X0Sequenza.w=Min(Max(I,16),LarghezzaInternaFinestraPrincipale-1)
Y0Sequenza.w=Min(Max(Y0,8),AltezzaInternaFinestraPrincipale-1-8-8-4-7)
X1Sequenza.w=Min(Max(F,16),LarghezzaInternaFinestraPrincipale-1)
Y1Sequenza.w=Min(Max(Y1,8+7),AltezzaInternaFinestraPrincipale-1-8-8-4)
ColoreSequenza.b=(Sequenza-1) MOD 16
WBox X0Sequenza,Y0Sequenza,X1Sequenza,Y1Sequenza,ColoreSequenza
If ModoDisegno=#SequenzaSelezionata
Wline X0Sequenza,Y0,X1Sequenza,Y1,15-ColoreSequenza
Wline X0Sequenza,Y1,X1Sequenza,Y0,15-ColoreSequenza
EndIf
If ModoDisegno=#SequenzaNonSelezionata
Wline X0Sequenza+1,Y0Sequenza+1,X1Sequenza-1,Y0Sequenza+1,15-ColoreSequenza
Wline X0Sequenza+1,Y1Sequenza-1,X1Sequenza-1,Y1Sequenza-1,15-ColoreSequenza
EndIf
If ModoDisegno=#SequenzaNonSelezionata
If InizioSequenzaVisibile=True
Wline I+1,Y0Sequenza+1,I+1,Y1Sequenza-1,15-ColoreSequenza
EndIf
If FineSequenzaVisibile=True
Wline F-1,Y0Sequenza+1,F-1,Y1Sequenza-1,15-ColoreSequenza
EndIf
EndIf
If Nome$="" Then Nome$="Sequence "+Str$(Sequenza)
If I>=16 OR I<LarghezzaInternaFinestraPrincipale OR F>=16 OR F<LarghezzaInternaFinestraPrincipale
WColour 15-ColoreSequenza,ColoreSequenza
I=Max(I,16):F=Min(F,LarghezzaInternaFinestraPrincipale-1)
WLocate I,Y0Sequenza:Print Left$(Nome$,(F-I+1)/8)
EndIf
EndIf
EndIf
End Statement
;--------------------------------------------------------------
;questa procedura mostra le sequenze nella finestra principale
;this procedure show the sequences in the main window
;-----------------------------------------------------
Statement MostraLeSequenze{}
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TracceVisibili
SHARED Traccia()
SHARED XTracceVisibili
SHARED YTracceVisibili
FineMotivo=0
Sequenza=0
PushItem Sequenza()
ResetList Sequenza()
While NextItem(Sequenza())=True
Sequenza+1
TracciaSequenza.w=Sequenza()\Traccia
If TracciaSequenza>0
DurataSequenza.l=Sequenza()\Durata
If DurataSequenza>0
PosizioneSequenza.w=(TracciaSequenza-YTracceVisibili)*8
If PosizioneSequenza>=8 AND PosizioneSequenza<8+TracceVisibili*8
NomeSequenza$=Sequenza()\Nome
InizioSequenza.l=Sequenza()\Inizio
EventiMusicaliSequenza.l=Sequenza()\EventiMusicali
If Sequenza=SequenzaSelezionata Then ModoDisegno.b=#SequenzaSelezionata Else ModoDisegno=#SequenzaNonSelezionata
MostraSequenza{NomeSequenza$,InizioSequenza,DurataSequenza,TracciaSequenza,EventiMusicaliSequenza,ModoDisegno}
FineMotivo=Max(FineMotivo,InizioSequenza+DurataSequenza)
EndIf
Traccia(TracciaSequenza-1)=True
EndIf
Else
Traccia(TracciaSequenza-1)=False
EndIf
Wend
PopItem Sequenza()
For Traccia.b=1 To TracceVisibili
If Traccia(YTracceVisibili+Traccia-1)=False
WLocate 16,Traccia*8:WColour 3,0:Print "Track ",Str$(YTracceVisibili+Traccia)," empty"
EndIf
Next Traccia
End Statement
Statement MostraSliderFinestraPrincipale{}
SHARED AreaInvisibileDelMotivo
SHARED BattutePerMinuto
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED TracceVisibili
SHARED XTracceVisibili
SHARED YTracceVisibili
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
MostraSlider{1,BattutePerMinuto-10,300-9,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}
;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
MostraSlider{2,YTracceVisibili,#MassimoTracce-TracceVisibili,"VERTICAL",#ListaGadgetPrincipale,#FinestraPrincipale}
;-------------------------------------
;calcola l'area invisibile del motivo
;evaluate the motive's invisible area
;-------------------------------------
AreaInvisibileDelMotivo=Max(FineMotivo-(LarghezzaInternaFinestraPrincipale-16),0)
;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
MostraSlider{3,XTracceVisibili,AreaInvisibileDelMotivo,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}
End Statement
;*********************************************
;Fine delle procedure ed inizio del programma
;procedures end and program start
;*********************************
;----------------------------------------------------
;questo programma puo' essere lanciato dal Workbench
;this program can be launched from Workbench
;_-------------------------------------------
WBStartup
BlitMode CookieMode
;calculates the frequency and the AMIGA voice period for all the 128 notes
CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
;loads the Topaz8 font
CaricaLaFonteDiCaratteriTopaz8{}
;sets the AMIGA speech
ImpostaIlParlatoDellAmiga{}
;loads note images for the basic event window
CaricaLeImmaginiDelleNote{}
;creates the background bitmap
CreaLaBitmapPerLImmagineDiSfondo{}
;sets the screen
ImpostaLoSchermo{}
;loads the background pic into its bitmap
CaricaLImmagineDiSfondoNellaBitmap{}
;loads the loaded LoadedMIDIFiles history
CaricaLaStoriaDeiFileMIDIAperti{}
;sets the main window
ImpostaLaFinestraPrincipale{}
;puts the background pic into the main window
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
;shows the main window' sliders
MostraSliderFinestraPrincipale{}
;--------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione delle
; battute per minuto
;copies into memory the measures per minute indication's on screen position
; background
;------------
CopiaLoSfondoSottoAlleBattutePerMinuto{}
;------------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione del tempo
;copies into memory the time indication's on screen position background
;-----------------------------------------------------------------------
CopiaLoSfondoSottoAlTempo{}
;shows the sequences
MostraLeSequenze{}
;shows the execution velocity in bar per minute
MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
;shows the metronomic time
MostraIlTempo{(#MisureDiBase-1)*16+#BattitiDiBase-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
If ParlatoAttivato=True Then Speak "Welcome to AmySequencer!"
;activates MIDI
AttivaMIDI{}
;-----------------
;clclo principale
;main loop
;----------
Repeat
If SecondoClicDelTopo.b=False
MettiLImmagineDiSfondoNellaFinestraPrincipale{}
MostraGliEventiMusicaliDisponibili{}
MostraLeSequenze{}
MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
MostraIlTempo{(Misure-1)*16+Battiti-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
MostraSliderFinestraPrincipale{}
SecondoClicDelTopo=True
EndIf
If NoteSuonate>0
If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)+" notes"
Messaggio$+" still playing:|clicking on OK you will stop "
If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
EZRequest "AmySequencer message",Messaggio$,"OK"
InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
NoteSuonate=0
EndIf
;--------------------------------------------------------------
;questa variabile cattura gli eventi della finestra principale
;this variable catch main window events
;---------------------------------------
EventoFinestraPrincipale.l=WaitEvent
Select EventoFinestraPrincipale
;------------------------------------
;se avete premuto un tasto del mouse
;if you have prssed a mouse button
;----------------------------------
Case #HaiPremutoUnTastoDelTopo
XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato.b=MButtons
Select TastoDelTopoCliccato
Case #TastoSinistroPremutoDelTopo
If YTopo>=8 AND YTopo<8+TracceVisibili*8
Sequenza=0
TracciaSelezionata.w=YTopo/8+YTracceVisibili
ResetList Sequenza()
While NextItem(Sequenza())=True
Sequenza+1
TracciaSequenza.w=Sequenza()\Traccia
InizioSequenza.l=Sequenza()\Inizio
DurataSequenza.l=Sequenza()\Durata
If DurataSequenza>0
If TracciaSequenza=TracciaSelezionata
FineSequenza.l=InizioSequenza+DurataSequenza-1
I.w=InizioSequenza-XTracceVisibili
F.w=FineSequenza-XTracceVisibili
If XTopo>=I AND XTopo<=F
SequenzaSelezionata=Sequenza
Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileUno
EndIf
EndIf
EndIf
Wend
LastItem Sequenza()
If AddItem(Sequenza())=True
Sequenza()\Traccia=TracciaSelezionata
Sequenza()\Inizio=XTracceVisibili+XTopo-16
Sequenza()\Durata=(#TicDiBasePerQuarto*4.0*Battiti)/Misure
Else
EZRequest "AmySequencer message","You have used all|the available sequences","OK"
EndIf
FineCicloWhileUno
EndIf
If YTopo>AltezzaInternaFinestraPrincipale-1-8-8 AND YTopo<AltezzaInternaFinestraPrincipale-8
If XTopo>LarghezzaInternaFinestraPrincipale-Len("Tempo=00/00")*8
CambiaLaMisuraDelTempo{}
MostraIlTempo{(Misure-1)*16+Battiti-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
EndIf
EndIf
SecondoClicDelTopo=False
Case #TastoSinistroDelTopoRilasciato
SecondoClicDelTopo=True
End Select
;---------------------------
;se avete premuto un gadget
;if you have pressed a gadget
;-----------------------------
; Case #HaiPremutoUnGadget
; Select GadgetHit
; Case 1
; LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
; BattutePerMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
; TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
; Case 2
; AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
; YTracceVisibili=ValoreSlider{2,#MassimoTracce-TracceVisibili,LunghezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
; Case 3
; LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
; XTracceVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
; End Select
; SecondoClicDelTopo=False
;------------------------------
;se avete rilasciato un gadget
;if you have released a gadget
;------------------------------
Case #HaiRilasciatoUnGadget
Select GadgetHit
Case 1
LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
BattutePerMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
TicPerCinquantesimoDiSecondo=(BattutePerMinuto*#TicDiBasePerQuarto*4.0)/3000
Case 2
AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
YTracceVisibili=ValoreSlider{2,#MassimoTracce-TracceVisibili,AltezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
Case 3
LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
XTracceVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
End Select
SecondoClicDelTopo=False
;--------------------------------------
;se avete attivato il menu' principale
;if you have activated main menu
;--------------------------------
Case #HaiAttivatoIlMenu
Select MenuHit
Case 0
If ItemHit=1
CaricaUnFileMIDI{""}
ImpostaLaFinestraPrincipale{}
EndIf
If ItemHit>3 AND ItemHit<VoceMenuEsci
NomeDelFileMIDI$=FileMIDIAperto$(ItemHit-4)
CaricaUnFileMIDI{NomeDelFileMIDI$}
ImpostaLaFinestraPrincipale{}
EndIf
Case 1
Select ItemHit
Case 0
EseguiGliEventiMusicali{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
MostraIlTempo{(Misure-1)*16+Battiti-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
Case 1
RegistraGliEventiMusicali{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
End Select
Case 2
If SequenzaSelezionata>0
Select ItemHit
Case 0
EditoreSequenza{}
Case 1
CambiaIlNomeDellaSequenzaSelezionata{}
End Select
Else
EZRequest "AmySequencer message","You must select a sequence first","OK"
EndIf
Case 3
If ItemHit=0 Then EditoreSuoni{}
Case 4
Select ItemHit
Case 0
AttivaMIDI{}
Case 1
ColoriOriginali=NOT ColoriOriginali
CaricaLImmagineDiSfondoNellaBitmap{}
CopiaLoSfondoSottoAlleBattutePerMinuto{}
CopiaLoSfondoSottoAlTempo{}
Case 2
If Exists("LoadedMIDIFilesHistory")
CancellaLaStoriaDeiFileMIDIAperti{}
ImpostaLaFinestraPrincipale{}
EndIf
End Select
End Select
;-------------------------------------------------------------------
;se avete scelto la voce Quit dal menu' Project attiva la variabile
; EsciDalProgramma
;if you have selected voice Quit from Project menu activates EsciDalProgramma
; flag
;------
If MenuHit=0 AND ItemHit=VoceMenuEsci Then EsciDalProgramma=True
SecondoClicDelTopo=False
;--------------------------
;se avete premuto un tasto
;if you have pressed a key
;--------------------------
Case #HaiPremutoUnTasto
;--------------------------------------------
;questa variabile memorizza il tasto premuto
;this variable store the key pressed
;------------------------------------
TastoPremuto$=Inkey$
Select TastoPremuto$
;-------------------------------------------------------------------
;se avete premuto il tasto Esc attiva la variabile EsciDalProgramma
;if you have typed Esc key activates EsciDalProgramma flag
;----------------------------------------------------------
Case TastoEsc$
EsciDalProgramma=True
Case TastoBackspace$
If SequenzaSelezionata>0
EliminaTuttiGliEventiMusicaliDellaSequenza{}
TracciaVuota.w=Sequenza()\Traccia
Sequenza()\Nome=""
Sequenza()\Traccia=0
Sequenza()\Inizio=0
Sequenza()\Durata=0
KillItem Sequenza()
ResetList Sequenza()
TracciaConSequenza.b=False
While NextItem(Sequenza())
If Sequenza()\Traccia=TracciaVuota
TracciaConSequenza=True
Pop While:Goto FineCicloWhileDue
EndIf
Wend
FineCicloWhileDue
If TracciaConSequenza=False Then Traccia(TracciaVuota-1)=False
SequenzaSelezionata=0
Else
EZRequest "AmySequencer message","You must select a sequence first","OK"
EndIf
Case TastoCursoreSu$
If YTracceVisibili>0 Then YTracceVisibili-1
Case TastoCursoreGiu$
If YTracceVisibili<#MassimoTracce-TracceVisibili Then YTracceVisibili+1
Case TastoCursoreDestra$
If XTracceVisibili<AreaInvisibileDelMotivo
XTracceVisibili+LarghezzaEventoBase
XTracceVisibili=Min(XTracceVisibili,AreaInvisibileDelMotivo)
EndIf
Case TastoCursoreSinistra$
If XTracceVisibili>0
XTracceVisibili-LarghezzaEventoBase
XTracceVisibili=Max(XTracceVisibili,0)
EndIf
End Select
SecondoClicDelTopo=False
End Select
;----------------------------------------------------------------
;ripete il ciclo se la variabile EsciDalProgramma e' disattivata
;repeats loop if EsciDalProgramma flag is deactivated
;-----------------------------------------------------
Until EsciDalProgramma=True
;----------------------
;fine del programma
;program end
;------------
End